2
.

. Я создаю пользовательскую модель, используя AbstractBaseUser и PermissionsMixin, следуя этим двум учебникам (tutorial-1 и tutorial-2).Требуется создать пользовательский ящик для пользовательской модели в django.

Эта модель до сих пор:

class User(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField('email address', unique=True, db_index=True) 
    username = models.CharField('username', unique=True, db_index=True) 
    joined = models.DateField(auto_now_add=True) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 
    is_staff = models.BooleanField(default=False) 

    USERNAME_FIELD = 'email' 

    def __unicode__(self): 
     return self.email 

Теперь то, что я запутался о том, что в tutorial-1, автор не сделал любой пользовательский менеджер для пользовательской модели пользователя. Вместо этого он использует формы для создания пользователя.

class RegistrationForm(forms.ModelForm): 
    email = forms.EmailField(label = 'Email') 
    password1 = forms.CharField(widget = forms.PasswordInput(), label = "Password") 
    password2 = forms.CharField(widget = forms.PasswordInput(), label = 'Retype password') 

    class Meta: 
     model = User 
     fields = ['email', 'username', 'password1', 'password2'] 

    def clean(self): 
     """ 
     Verify that the values entered into the password fields match 
     """ 
     cleaned_data = super(RegistrationForm, self).clean() 
     if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data: 
      if self.cleaned_data['password1'] != self.cleaned_data['password2']: 
       raise ValidationError("Password don't match.") 
     return self.cleaned_data 

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

Но в tutorial-2, ее автор сделал собственный менеджер для пользовательской модели пользователя.

class UserManager(BaseUserManager): 

    def create_user(self, email, password, **kwargs): 
     user = self.model(
      email=self.normalize_email(email), 
      is_active=True, 
      **kwargs 
     ) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, password, **kwargs): 
     user = self.model(
      email=email, 
      is_staff=True, 
      is_superuser=True, 
      is_active=True, 
      **kwargs 
     ) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

Реферирования Django Docs, есть пример пользовательской модели пользователя, и он использует собственный менеджер. Мой вопрос заключается в том, нормально ли делать какой-либо другой пользовательский менеджер, а если нет, то зачем создавать пользовательский менеджер?

ответ

1

Я думаю, что это соответствующий раздел из the docs для вас:

Вы должны также определить пользовательский менеджер для вашей модели пользователя. Если ваша модель пользователя определяет username, email, is_staff, is_active, is_superuser, last_login и date_joined поля такие же, как по умолчанию Джанго User, вы можете просто установить Джанго UserManager; однако, если ваша модель пользователя определяет разные поля, вам необходимо определить пользовательский менеджер, который расширяет BaseUserManager, предоставляя [методы create_user() и create_superuser()].

Пример в документах должен определять пользовательский менеджер, чтобы он мог установить поле date_of_birth.

Похоже, что в примере в учебном пособии требуется настраиваемый менеджер, поскольку он использует email как уникальный идентификатор и не имеет отдельного поля имени пользователя.

+0

Да, что я получил сейчас, спасибо. Но я все еще смущен, потому что в учебнике-1 он использует 'USERNAME_FIELD' в качестве электронного письма, но он не сделал другого настраиваемого менеджера, чтобы справиться с этим. Не могли бы вы помочь мне в этом. Спасибо. –

+0

Если вы [посмотрите на этот комментарий] (http://blackglasses.me/2013/09/17/custom-django-user-model/#comment-1527045990) в первом учебнике, мне кажется, что это был ошибка, чтобы оставить менеджера. – Alasdair

+0

Хорошо. Я думаю, что я следую сейчас. Большое вам спасибо за вашу помощь. –

Смежные вопросы