2013-05-02 13 views
5

Sto cercando di capire come escludere il nome utente e/o la password da UserChangeForm. Ho provato sia exclude e fields ma non lavoro per questi due campi.Escludere nome utente o password da UserChangeForm in Django Auth

Ecco po 'di codice:

class ArtistForm(ModelForm): 
    class Meta: 
     model = Artist 
     exclude = ('user',) 

class UserForm(UserChangeForm): 
    class Meta: 
     model = User 
     fields = (
      'first_name', 
      'last_name', 
      'email', 
      ) 
     exclude = ('username','password',) 

    def __init__(self, *args, **kwargs): 
     self.helper = FormHelper 
     self.helper.form_tag = False 
     super(UserForm, self).__init__(*args, **kwargs) 
     artist_kwargs = kwargs.copy() 
     if kwargs.has_key('instance'): 
      self.artist = kwargs['instance'].artist 
      artist_kwargs['instance'] = self.artist 
     self.artist_form = ArtistForm(*args, **artist_kwargs) 
     self.fields.update(self.artist_form.fields) 
     self.initial.update(self.artist_form.initial) 

    def clean(self): 
     cleaned_data = super(UserForm, self).clean() 
     self.errors.update(self.artist_form.errors) 
     return cleaned_data 

    def save(self, commit=True): 
     self.artist_form.save(commit) 
     return super(UserForm, self).save(commit) 

risposta

9

Non sarà in grado di fare questo se si utilizza UserChangeForm.

Vedere questo https://github.com/django/django/blob/master/django/contrib/auth/forms.py.

Si noterà che UserChangeForm in questa pagina definisce esplicitamente username e password. Questi campi sono presenti nella variabile declared_fields nel modulo.

exclude e fields funzionano solo su campi che sono presi da model definito in Meta. Se si definisce esplicitamente un campo, ad esempio declared_fields, questi saranno presenti nel modulo anche se sono stati esclusi utilizzando exclude. Quindi, questi campi mostrano per te.

Per saperne di più su questo controllo __new__ di ModelFormMetaclass a https://github.com/django/django/blob/master/django/forms/models.py

Soluzione:

Non usare UserChangeForm e leggere il suo codice. Non ti dà molto. È possibile scrivere il proprio modulo che si estende solo da ModelForm e impostare Meta Model come utente. Copia le parti da UserChangeForm nel modulo.

class UserForm(forms.ModelForm): 

    class Meta: 
     model = User 

    def __init__(self, *args, **kwargs): 
     #copy any functionality you want form UserChangeForm 

    def clean_password(self): 
     #copy functionality provided by UserChangeForm 
+0

Ok che ha fatto il lavoro, ma ora username e password diventano NULL ogni volta che chiamo su 'save()'. Inoltre, l'argomento della mia estesa classe utente non viene salvato. – codingjoe