2013-07-28 14 views
10

django-registration 1.0 ora supporta i modelli utente personalizzati django 1.5. La documentazione django-registrazione ha solo la seguente voce FAQ su di esso:Sottoclassi forme django-registration 1.0 per modelli utente personalizzati django 1.5

sto usando Django 1.5 e un modello utente personalizzata; come faccio a fare quel lavoro?

Anche se i due backend incorporati forniti con django-registrazione sia assumono il modello utente predefinito di Django, la base classi di visualizzazione sono volutamente user-model-agnostic. È sufficiente creare sottoclasse di e implementare la logica per il modello utente personalizzato.

Non sono sicuro di quali viste ho bisogno per creare una sottoclasse e cosa dovrebbero esserci. Ho anche notato che lo ProfileManager nella registrazione di django assume ancora un campo di nome utente separato.

Nel mio caso specifico, ho rimosso il campo 'username', ha aggiunto una 'display_name', e ha reso il campo di identificazione 'e-mail':

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 

Senza sottoclassi tutte le classi django-registrazione, i il rendering predefinito del modulo di registrazione richiama i campi da User anziché da MyUser.

Ho visto il seguente thread SO django-registration app and Django 1.5 custom user model, ma non è stato di aiuto.

Aggiornamento

ho notato che registrationform è codificata con un campo 'nome utente'. Le FAQ menzionano solo la sottoclasse del backend, quindi non sono sicuro di quale sia l'intenzione qui. Dovrei sottoclasse anche il modulo?

+1

Si prega di dare un'occhiata a questo impegno - https://bitbucket.org/LinnTroll/django-registration-1.5/commits/c71d5b8e273551cffdfc7869545430e3 !! È necessario eseguire la sottoclasse di 'DefaultBackend',' RegistrationFormFromUserModel' e 'RegistrationManager' per questo. – pankaj28843

+0

Hai modificato AUTH_USER_MODEL nel nuovo modello utente personalizzato in settings.py? – Wei

+0

Cosa hai finito? Sto pensando solo a gestirlo, ma a definire esplicitamente i campi nel modulo di registrazione invece di usare semplicemente il tag del modello 'form'. Non ideale, ma penso che potrebbe essere l'opzione più semplice. – bnjmn

risposta

1

Alcune parti sono la maggior parte sicuramente non Django 1.5 compatibile ancora: 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'] 

Quindi, a meno che tali metodi sono cambiati e/o li sottoclasse, non funzionerà ancora.

Per il vostro caso specifico il modulo di registrazione dovrebbe fare il trucco:

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

Oltre a una proprietà personalizzata del modello:

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) 
Problemi correlati