2013-05-02 16 views
5

Kullanıcı adı ve/veya parolayı UserChangeForm'dan nasıl hariç tutacağınızı anlamaya çalışıyorum. Hem exclude hem de fields'u denedim, ancak bu iki alan için çalışmıyorum.Django Auth'daki UserChangeForm'dan kullanıcı adı veya şifreyi hariç tut

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) 

cevap

9

Eğer UserChangeForm kullanıyorsanız bunu yapmak mümkün olmayacaktır:

İşte bazı kod. Bu https://github.com/django/django/blob/master/django/contrib/auth/forms.py numaralı telefona bakın.

Bu sayfada UserChangeForm açık olarak username ve password tanımladığını göreceksiniz. Bu alanlar, formdaki declared_fields değişkeninde bulunur.

exclude ve fields yalnızcaMeta numaralı belgede belirtilen alanlarla çalışılır. Açık bir şekilde declared_fields alanlarını tanımlarsanız, bunlar exclude kullanılarak dışlanmış olsa bile formda bulunur. Yani, bu alanlar sizin için gösterir.

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

Geçici olarak ModelFormMetaclass bu çek __new__ daha okumak için:

UserChangeForm kullanmak ve kodunu okumayın. Size fazla şey sağlamaz. Sadece ModelForm'dan itibaren kendi formunuzu yazabilir ve kullanıcı olarak Meta Model'u ayarlayabilirsiniz. Parçaları, formunuzdaki UserChangeForm'dan kopyalayın. ben sana yardım edebilir düşünüyorum

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 oku yazmak ama şimdi kullanıcı adı ve şifre 'save()' dediğim her zaman NULLED olsun. Ayrıca, genişletilmiş kullanıcı sınıfımın argümanı, kayıtlı eteri alamıyor. – codingjoe

İlgili konular