2013-07-28 12 views
10

django-rejestracja 1.0 ma teraz obsługę niestandardowych modeli użytkowników django 1.5. Dokumentacja rejestracyjna django zawiera tylko następujący element FAQ dotyczący tego:Podklasy Django-rejestracja 1.0 formularze dla niestandardowych modeli użytkowników django 1.5

Używam Django 1.5 i niestandardowego modelu użytkownika; jak mogę wykonać tę pracę?

Mimo dwóch wbudowanych backendów zasilanych django rejestracji zarówno zakładać domyślnego modelu użytkownika Django, podstawa widok zajęcia są celowo przez użytkownika modelu agnostykiem. Po prostu podklasy je i wdrożyć logikę dla niestandardowego modelu użytkownika.

Nie jestem pewien, które widoki muszę podklasy i co należy w nich. Zauważyłem także, że ProfileManager w rejestracji django nadal przyjmuje osobne pole nazwy użytkownika.

W moim konkretnym przypadku, usunęliśmy pole „Nazwa użytkownika”, dodał „DISPLAY_NAME” i uczynił „email” pole identyfikacji:

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 

Bez żadnych klas instacji Django-rejestracji, domyślne renderowanie formularza rejestracyjnego ciągnie w polach od User zamiast MyUser.

Widziałem następujący wątek SO django-registration app and Django 1.5 custom user model, ale to nie pomogło.

Aktualizacja

Zauważyłem, że RegistrationForm jest sztywno z pola 'Nazwa użytkownika'. W Najczęściej zadawanych pytaniach wspomina się tylko o podklasowaniu zaplecza, więc nie jestem pewien, co to jest zamiar. Czy powinienem również podklasować formularz?

+1

Proszę spojrzeć na ten popełnić - https://bitbucket.org/LinnTroll/django-registration-1.5/commits/c71d5b8e273551cffdfc7869545430e3 !! Potrzebna jest do tego podklasa 'DefaultBackend',' RegistrationFormFromUserModel' oraz 'RegistrationManager'. – pankaj28843

+0

Czy zmieniono AUTH_USER_MODEL na nowy niestandardowy model użytkownika w settings.py? – Wei

+0

Co się stało? Zastanawiam się, czy po prostu to potraktować, ale wyraźnie zdefiniować pola w formularzu rejestracyjnym zamiast po prostu użyć znacznika szablonu 'form'. Nie idealne, ale myślę, że to najprostsza opcja. – bnjmn

Odpowiedz

1

Niektóre części są zdecydowanie nie Django 1.5 kompatybilny jeszcze: 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'] 

Więc chyba że te metody są zmieniane i/lub ich podklasy, to nie będzie jeszcze pracować.

dla konkretnego przypadku formularz rejestracyjny powinno załatwić sprawę:

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'] 

Oprócz właściwości niestandardowej modelu:

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) 
Powiązane problemy