2013-05-02 21 views
5

Próbuję znaleźć sposób, aby wykluczyć nazwę użytkownika i/lub hasło z UserChangeForm. Próbowałem zarówno exclude i fields, ale nie działa dla tych dwóch pól.Wyklucz nazwę użytkownika lub hasło z UserChangeForm w Django Auth

Oto niektóre kodu:

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) 

Odpowiedz

9

Nie będzie w stanie to zrobić, jeśli używasz UserChangeForm.

Zobacz to https://github.com/django/django/blob/master/django/contrib/auth/forms.py.

Zauważysz, że na tej stronie UserChangeForm jawnie zdefiniowano username i password. Pola te występują w formularzu w zmiennej declared_fields.

exclude i fields działają tylko na polach, które pochodzą z model zdefiniowanej w Meta. Jeśli jednoznacznie zdefiniujesz jakieś pole, tj. declared_fields, będą one obecne w formularzu, nawet jeśli zostały wykluczone przy użyciu exclude. Tak więc te pola pokazują się dla Ciebie.

Aby dowiedzieć się więcej na temat tej kontroli __new__ z ModelFormMetaclass na https://github.com/django/django/blob/master/django/forms/models.py

obejścia:

Nie używaj UserChangeForm i odczytać jego kod. To nie zapewnia ci dużo. Możesz napisać swój własny formularz, który tylko rozszerza się od ModelForm i ustawia Meta Model jako użytkownika. Skopiuj części z UserChangeForm w formularzu.

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 który spełnił swoje zadanie, ale teraz nazwa użytkownika i hasło otrzymują NULL za każdym razem, gdy wzywam 'save()'. Plus argument z mojej rozszerzonej klasy użytkownika nie zostanie zapisany w eterze. – codingjoe