2013-05-02 1 views
5

UserChangeForm에서 사용자 이름 및/또는 비밀번호를 제외하는 방법을 알아 내려고하고 있습니다. 나는 excludefields을 시도했지만이 두 필드에서는 작동하지 않습니다.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에 있습니다.

excludefieldsmodel에서 가져온 필드가 Meta에서 정의 된 필드에서만 작동합니다. 명시 적으로 필드를 정의하는 경우 declared_fieldsexclude을 사용하여 제외 된 경우에도 양식에 표시됩니다. 따라서이 필드가 표시됩니다.

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

확인 읽기 쓰기 만 이제 username과 password는'save()'를 호출 할 때마다 NULL을 얻습니다. 게다가 확장 된 사용자 클래스의 인수는 저장된 에테르를 얻지 못합니다. – codingjoe

관련 문제