【问题标题】:django custom user can't set attribute errordjango自定义用户无法设置属性错误
【发布时间】:2020-11-25 08:25:18
【问题描述】:

我遵循了关于自定义用户的 CodingEntrepreneurs 教程并将其扩展为拥有 3 种类型的用户:学校、家长和供应商。 我为每种类型的用户创建了视图和表单。 在 forms.py 我有

class ParentSignUpForm(forms.ModelForm):
    """A form for creating new users. Includes all the required
    fields, plus a repeated password."""
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
    class Meta():
        model = User
        fields = ('email', )

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        user = super(ParentSignUpForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        
        if commit:
            user.is_parent = True
            user.save()
        return user

我尝试将 is_parent 属性从 False 更改为 True。但是,错误是:

  File "/home/azamat/dev/dj_test/src/accounts/forms.py", line 137, in save
    user.is_parent = True
AttributeError: can't set attribute

如何解决这个问题?或者有什么更好的方法来保存不同类型的用户?

更新:

from django.contrib.auth.models import (
    AbstractBaseUser, BaseUserManager
)



class UserManager(BaseUserManager):
    def create_user(self, email, password=None, is_staff=False, is_admin=False, is_active=True, is_parent=False, is_school=False, is_vendor=False):
        if not email:
            raise ValueError("Users must have an email address")
        if not password:
            raise ValueError("Users must have a password")

        user_obj = self.model(
            email = self.normalize_email(email)
        )
        user_obj.set_password(password) # change user password
        user_obj.parent = is_parent
        user_obj.school = is_school
        user_obj.vendor = is_vendor
        user_obj.active = is_active
        user_obj.staff = is_staff
        user_obj.admin = is_admin
        user_obj.save(using=self._db)
        return user_obj

    def create_parentuser(self, email, password=None):
        user = self.create_user(
                email,
                password=password,
                is_parent=True
        )
        return user

    def create_schooluser(self, email, password=None):
        user = self.create_user(
                email,
                password=password,
                is_school=True
        )
        return user

    def create_vendoruser(self, email, password=None):
        user = self.create_user(
                email,
                password=password,
                is_vendor=True
        )
        return user

    def create_staffuser(self, email, password=None):
        user = self.create_user(
                email,
                password=password,
                is_staff=True
        )
        return user

    def create_superuser(self, email, password=None):
        user = self.create_user(
                email,
                password=password,
                is_staff=True,
                is_admin=True,
        )
        return user

class User(AbstractBaseUser):
    email       = models.EmailField(max_length=255, unique=True)
    active      = models.BooleanField(default=True) # can login 
    parent      = models.BooleanField(default=False) # parent user
    school      = models.BooleanField(default=False) # school admin user
    vendor      = models.BooleanField(default=False) # vendor user  
    staff       = models.BooleanField(default=False) # staff user non superuser
    admin       = models.BooleanField(default=False) # superuser 
    timestamp   = models.DateTimeField(auto_now_add=True)
    
    USERNAME_FIELD = 'email' #username

    objects = UserManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_parent(self):
        return self.parent

    @property
    def is_school(self):
        return self.school
        
    @property
    def is_vendor(self):
        return self.is_vendor

    @property
    def is_active(self):
        return self.active

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin


【问题讨论】:

  • 你能发布你的用户模型吗?

标签: django django-allauth django-registration django-custom-user


【解决方案1】:

我是如何解决的:

我已将 REQUIRED_FIELDS = ['parent', 'school', 'vendor' ] 添加到我的 model.py 所以现在在我的注册页面上,我有 3 个检查按钮,我可以在其中选择所需的用户类型。

forms.py 中,我只留下了 RegisterForm 并删除了我的 3 种用户类型的注册表单

class RegisterForm(forms.ModelForm):
    
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('email', **'parent', 'school', 'vendor'**) #'added 3 fields',)

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(RegisterForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        # user.active = False # send confirmation email
        if commit:
            user.save()
        return user

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多