2013-07-28 2 views
10

django-registration 1.0 теперь поддерживает пользовательские модели django 1.5. Документация Джанго регистрации только имеет следующий FAQ пункт о нем:Подкласс django-registration 1.0 формы для пользовательских моделей django 1.5

Я использую Django 1.5 и заказная модель пользователя; как я могу это сделать?

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

Я не уверен, какие представления мне нужны для подкласса и что им нужно делать. Я также заметил, что ProfileManager в django-registration все еще принимает отдельное поле имени пользователя.

В моем конкретном случае, я удалил поле «имя пользователя», добавил «DISPLAY_NAME», и сделал «электронная почта» идентифицирующее поле:

class MyUser(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(
     verbose_name="Email Address", 
     max_length=384, 
     unique=True, 
     db_index=True,) 
    display_name = models.CharField(max_length=128, blank=True) 
    date_joined = models.DateTimeField(default=timezone.now) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 

    def get_full_name(self): 
     return self.email 

    def get_short_name(self): 
     return self.email 

    def __unicode__(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_staff(self): 
     return self.is_admin 

Без подклассов любых Джанго-регистрации классов, По умолчанию рендеринг формы регистрации тянет в полях от User вместо MyUser.

Я видел следующую нить SO django-registration app and Django 1.5 custom user model, но это не помогло.

Update

Я заметил, что RegistrationForm жестко закодировано с полем 'Имя пользователя'. В FAQ часто упоминается подклассу бэкэнда, поэтому я не уверен, что это за намерение. Должен ли я также подклассифицировать форму?

+1

Пожалуйста, посмотрите на это обязательство - https://bitbucket.org/LinnTroll/django-registration-1.5/commits/c71d5b8e273551cffdfc7869545430e3 !! Для этого вам необходимо подклассы 'DefaultBackend',' RegistrationFormFromUserModel', а также 'RegistrationManager'. – pankaj28843

+0

Вы изменили AUTH_USER_MODEL на новую пользовательскую модель в settings.py? – Wei

+0

Что вы делаете? Я думаю о том, чтобы просто обрабатывать это, но явно определяя поля в регистрационной форме, а не просто использовать тег шаблона 'form'. Не идеально, но я думаю, что это может быть самый простой вариант. – bnjmn

ответ

1

Некоторые части наиболее определенно не Django 1.5 совместимую еще: https://bitbucket.org/ubernostrum/django-registration/src/8f242e35ef7c004e035e54b4bb093c32bf77c29f/registration/forms.py?at=default#cl-48

class RegistrationForm(forms.Form): 
    # ... 

    def clean_username(self): 
     # ... 
     # The line below needs fixing 
     existing = User.objects.filter(username__iexact=self.cleaned_data['username']) 
     if existing.exists(): 
      raise forms.ValidationError(_("A user with that username already exists.")) 
     else: 
      return self.cleaned_data['username'] 

Таким образом, если эти методы не будут изменены и/или подкласс их, он не работает.

Для вашего конкретного случая эта регистрационная форма должна сделать трюк:

from registration import forms as registration_forms 
from django.contrib import auth 

class RegistrationForm(registration_forms.RegistrationForm): 
    def clean_username(self): 
     ''' 
     Validate that the username is alphanumeric and is not already 
     in use. 
     ''' 
     User = auth.get_user_model() 
     existing = User.objects.filter(display_name__iexact=self.cleaned_data['username']) 
     if existing.exists(): 
      raise forms.ValidationError(_("A user with that name already exists.")) 
     else: 
      return self.cleaned_data['username'] 

В дополнение к пользовательские свойства на модели:

class MyUser(AbstractBaseUser, PermissionsMixin): 
    # ... 

    def get_username(self): 
     return self.display_name 

    def set_username(self, username): 
     self.display_name = username 

    def del_username(self): 
     del self.display_name 

    username = property(get_username, set_username, del_username)