Django: нет атрибута 'get_by_natural_key'

В настоящее время я пытаюсь реализовать мою собственную модель пользователя. Для этого я создал новое приложение "Аккаунты". Но каждый раз, когда я пытаюсь создать нового пользователя, я получаю следующую ошибку:

AttributeError: у объекта AnonymousUser нет атрибута _meta

account - models.py:

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



#User Model Manager
class UserManager(BaseUserManager):
    def create_user(self, username, password=None):
        """
        Creates and saves a User with the given username and password.
        """
        if not username:
            raise ValueError('Error: The User you want to create must have an username, try again')

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

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

    def create_staffuser(self, username, password):
        """
        Creates and saves a staff user with the given username and password.
        """
        user = self.create_user(
            username,
            password=password,
        )
        user.staff = True
        user.save(using=self._db)
        return user

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


class User(AbstractBaseUser):

    #User fields
    user = models.CharField(verbose_name='username',max_length=30,unique=True)
    bio = models.TextField(max_length=5000, blank=True, null=True)
    pubpgp = models.TextField(blank=True, null=True)

    #Account typs
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False) # a admin user; non super-user
    admin = models.BooleanField(default=False) # a superuser
    # notice the absence of a "Password field", that's built in.

    USERNAME_FIELD = 'user'
    REQUIRED_FIELDS = [] # Username & Password are required by default.

    def get_full_name(self):
        # The user is identified by their Username ;)
        return self.user

    def get_short_name(self):
        # The user is identified by their Username address
        return self.user
    def __str__(self):
        return self.user

    def has_perm(self, perm, obj=None):
        """Does the user have a specific permission?"""
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        """Does the user have permissions to view the app `app_label`?"""
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        """Is the user a member of staff?"""
        return self.staff

    @property
    def is_admin(self):
        """Is the user a admin member?"""
        return self.admin

    @property
    def is_active(self):
        """Is the user active?"""
        return self.active

    objects = UserManager()

После этого я вернулся к settings.py и добавил свою пользовательскую модель в свое приложение для блога:

AUTH_USER_MODEL = 'accounts.User'

и я также добавил

INSTALLED_APPS = [
...
    'accounts',
...   
]

Все эти пользовательские модели /django немного новы для меня, и я понятия не имею, что означает ошибка "AttributeError: объект" Менеджер "не имеет атрибута get_by_natural_key" ".

Спасибо

1 ответ

Решение

Редактировать: AttributeError: объект "UserManager" не имеет атрибута "normalize_username"

normalize_username принадлежит AbstractBaseUser, вы можете попробовать код ниже.

В signup вид, когда вы сохраняете форму, вы уже получаете пользователя (form.save()). Потому что причина аутентификации заключается в проверке набора учетных данных и получении пользователя (но у нас уже есть пользователь)

В этой строке: user = authenticate(username=username, password=raw_password), authenticate метод занимает request в качестве первого аргумента, так и должно быть: user = authenticate(request, username=username, password=raw_password), следовательно, вы получили объект Ошибка 'AnonymousUser', не имеющий атрибута _meta.

Пытаться:

def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect('post_list')

Изменить UserManager:

Переименуйте всех созданных пользователей под другим именем (например, my_user ) потому что у вас есть буксирные варибалы с тем же именем ( USERNAME_FIELD и пользователь создал)

Вот подпись create_user а также create_superuser

create_user(*username_field*, password=None, **other_fields) create_superuser(*username_field*, password, **other_fields)

Они берут USERNAME_FIELD в качестве первого аргумента, а ваш user

class UserManager(BaseUserManager):
    def create_user(self, user, password=None):
        """
        Creates and saves a User with the given username and password.
        """
        if not user:
            raise ValueError('Error: The User you want to create must have an username, try again')

        my_user = self.model(
            user=self.model.normalize_username(user),
        )

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

    def create_staffuser(self, user, password):
        """
        Creates and saves a staff user with the given username and password.
        """
        my_user = self.create_user(
            user,
            password=password,
        )
        my_user.staff = True
        my_user.save(using=self._db)
        return my_user

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

Я надеюсь, это поможет.

Другие вопросы по тегам