2013-05-02 3 views
5

Ich versuche herauszufinden, wie man den Benutzernamen und/oder das Passwort von der UserChangeForm ausschließen kann. Ich habe sowohl exclude als auch fields ausprobiert, aber ich arbeite nicht für diese beiden Felder.Benutzernamen oder Passwort von UserChangeForm in Django Auth ausschließen

Hier einige Code:

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) 

Antwort

9

Sie werden nicht in der Lage sein, dies zu tun, wenn Sie UserChangeForm verwenden.

Siehe hierzu https://github.com/django/django/blob/master/django/contrib/auth/forms.py. Sie werden feststellen, dass UserChangeForm auf dieser Seite username und password explizit definiert. Diese Felder sind in der Variablen declared_fields auf dem Formular vorhanden.

exclude und fields nur an Feldern arbeiten, die von model in Meta definiert sind. Wenn Sie ein Feld explizit definieren, z. B. declared_fields, sind sie im Formular vorhanden, auch wenn sie mit exclude ausgeschlossen wurden. Also, diese Felder zeigen für Sie.

Um mehr über diese Prüfung __new__ von ModelFormMetaclass bei https://github.com/django/django/blob/master/django/forms/models.py

Umgehung zu lesen:

nicht UserChangeForm Verwenden und seinen Code lesen. Es bietet dir nicht viel. Sie können ein eigenes Formular schreiben, das sich nur von ModelForm erstreckt und Meta Model als Benutzer festlegen. Kopieren Sie die Teile von UserChangeForm in Ihr Formular.

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 Lesen Sie mehr hier, der den Auftrag hat, aber Jetzt werden Benutzername und Passwort bei jedem Aufruf von 'save()' NULL gesetzt. Außerdem wird das Argument meiner erweiterten Benutzerklasse nicht als Äther gespeichert. – codingjoe

Verwandte Themen