2016-12-26 363 views
0

我有以下错误:Django的AttributeError的:“用户”对象有没有属性“set_password”,但用户没有覆盖

AttributeError: 'User' object has no attribute 'set_password' 

的问题是我没有覆盖类用户:

我model.py:

class User(models.Model): 
    username = models.CharField(max_length=30) 
    password = models.CharField(max_length=30) 
    email = models.EmailField() 

    def __str__(self): 
     return self.username 

我view.py:

def post(self, request): 
    form = self.form_class(request.POST) 

    if form.is_valid(): 

     user = form.save(commit=False) 
     print type(user) 
     # Cleaning and normalizing data 
     username = form.cleaned_data['username'] 
     password = form.cleaned_data['password'] 
     user.set_password(password) 
     user.save() 

     # returns User objects if the credential are correct 
     user = authenticate(username=username, password=password) 

     if user is not None: 
      if user.is_active: 
       login(request, user) 
       return redirect('website:home') 
    return render(request, self.template_name, {'form': form}) 

这是我form.py:

class UserForm(forms.ModelForm): 
    password = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control', 
                  'type': 'password', 
                  'placeholder': 'Enter your password'})) 
    class Meta: 
     model = models.User 

我真的不知道还该不该覆盖用户类。在这种情况下,我应该和在哪种情况下我不应该?

回答

3

您需要继承AbstractUser才能获得访问set_password属性。而不是使用models.Model使用:

from django.contrib.auth.models import AbstractUser 

class User(AbstractUser): 
    ... 

User模式是不一样的Django的User模型。

参考custom user model

+0

我这样做了,但它产生如下问题:django.core.exceptions.FieldError:类局部场“密码”“用户”的冲突与基类名称类似的字段“AbstractUser” – mel

+0

这是因为在AbstractUser中有一个称为密​​码的字段。 –

+0

是的,我知道,但那么好的做法是什么? – mel

0

在Django用户模型.set_password,但如果你做你自己,你应该从那里尝试OneToOneField(用户),你只需要确保你节省的看法。

 user_form = UserForm(data=request.POST) 
    if user_form.is_valid(): 
     user = user_form.save() 
     user.set_password(user.password) 
     profile = user.userprofile 
     profile.bio = request.POST['bio'] 
     profile.save() 
相关问题