Soheil Tayyeb
Soheil Tayyeb

Reputation: 315

Django : AbstractBaseUser And Error =' AttributeError: can't set attribute '

I am new in django . I writing my django user model and user manager like follow :

UserManager:

class UserManager(BaseUserManager):
    def create_user(self, username, tel_number, password=None):
        """
        Creates and saves a User with the given email and password.
        """
        if not username:
            raise ValueError('Users must have an email address')

        user = self.model(
            username=self.normalize_email(username),
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, tel_number, password):
        """
         Creates and saves a superuser with the given email and password.
        """
        user = self.create_user(username, tel_number=tel_number,
                                password=password
                                )
        user.is_admin = True
        user.save(using=self._db)
        return user

And my UserModel is :

class Users(AbstractBaseUser, PermissionsMixin):
    object = UserManager()
    username = models.EmailField(_('UserName'), max_length=75, null=False, blank=False, unique=True)
    first_name = models.CharField(_('FirstName'), max_length=50, null=True, blank=True)
    last_name = models.CharField(_('LastName'), max_length=70, null=True, blank=True)
    tel_number = models.IntegerField(_('TelNumber'), null=True, blank=True)
    address = models.CharField(_('Address'), max_length=250, null=True, blank=True)
    user_image = models.ImageField(_('UserImage'), upload_to='user_avatar', blank=True, null=True)
    date_time = models.DateTimeField(_('DateTime'), auto_now=True, null=True, blank=True)
    activated = models.BooleanField(_('Activated'), default=False)
    is_admin = models.BooleanField(_('is_admin'), default=False)

    def __unicode__(self):
        return self.username

    def get_full_name(self):
        return self.first_name + " " + self.last_name

    class Meta:
        ordering = ['-id']

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

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

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

    def has_module_perms(self, app_label):
        return self.is_admin

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['tel_number']

Now i want create super user i give this error :

File "E:\AB - Python\Ads\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 149, in handle self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)

File "E:\AB - Python\Ads\project\dijiads\users\models.py", line 31, in create_superuser password=password

File "E:\AB - Python\Ads\project\dijiads\users\models.py", line 19, in create_user username=self.normalize_email(username),

File "E:\AB - Python\Ads\lib\site-packages\django\db\models\base.py", line 470, in init setattr(self, field.attname, val) AttributeError: can't set attribute

What's wrong?
If you have a better suggestion to write this model Please tell me.

Upvotes: 3

Views: 3351

Answers (1)

zhui
zhui

Reputation: 76

You can try to remove:

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

from Users class. is_superuser is a field in permissionsmixin inherited by users class.

Upvotes: 6

Related Questions