2013-05-02 20 views
5

私はUserChangeFormからユーザー名またはパスワードを除外する方法を理解しようとしています。私はexcludefieldsの両方を試しましたが、これらの2つのフィールドでは動作しません。ここでDjango AuthのUserChangeFormからユーザー名またはパスワードを除外

は、いくつかのコードです:

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) 

答えて

9

あなたはUserChangeFormを使用している場合、これを行うことはできません。

これを参照してくださいhttps://github.com/django/django/blob/master/django/contrib/auth/forms.py

このページのUserChangeFormには、usernamepasswordが明示的に定義されています。これらのフィールドは、フォーム上の変数declared_fieldsにあります。

excludeおよびfieldsは、modelから得られたフィールドのみがMetaで定義されています。明示的にフィールドを定義した場合、declared_fieldsは、excludeを使用して除外されていてもフォームに表示されます。したがって、これらのフィールドはあなたのために表示されます。

https://github.com/django/django/blob/master/django/forms/models.py

回避策でModelFormMetaclassのは、このチェック__new__に続きを読むには:

がUserChangeFormを使用し、そのコードを読んではいけません。それはあなたに多くを提供しません。 ModelFormからのみ拡張し、Meta Modelをユーザーとして設定して独自のフォームを作成できます。フォームにUserChangeFormの部分をコピーします。私はそれはあなたを助けるかもしれないと思う

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]を読んで書くが、現在、usernameとpasswordは 'save()'を呼び出すたびにNULLになります。私の拡張されたユーザークラスからの引数は、保存されたエーテルを取得しません。 – codingjoe

0

...

テンプレート内のフォームフィールドを反復処理しながら、

if for field in UserChangeFormObject: 
    {% ifnotequal field.lable password %} 
     #process your form field here 
    {% endifnotequal%} 

はもっとここに仕事をしたhttps://docs.djangoproject.com/en/1.6/releases/1.2/

関連する問題