Django如何在单个modelForm中仅为updateview而不是createview排除字段?

时间:2017-10-27 07:20:37

标签: python-2.7 django-forms django-class-based-views

我有一个像UserForm

这样的表单类
class UserForm(forms.ModelForm):
   email=forms.EmailField(widget=forms.EmailInput(attrs={'class':'form-control','required': True}))
   password=forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control','required': True}))

   class Meta:
       model=User
       fields=['email','password']

和2查看CreateView和UpdateView。

class UserCreate(CreateView):
    template_name='admin/user_crud_form.html'
    form_class=UserForm

    def get_success_url(self):
        return reverse('list_user')

class UserUpdate(UpdateView):
    template_name='admin/user_crud_form.html'
    form_class=UserForm
    exclude = ('password',)

    def get_success_url(self):
        return reverse('list_user')

现在我只需要排除密码字段进行编辑。我每次只更改电子邮件。但不是密码**。

但是在创建用户时,我将使用两者。怎么样?? 此代码不会在更新视图中排除密码字段。 **我不想使用2个表格来创建和更新**

提前致谢

1 个答案:

答案 0 :(得分:1)

您正在使用模型表单。因此,您可以覆盖方法__init__。 请尝试下面的代码

class UserForm(forms.ModelForm):

   def __init__(self, *args, **kwargs):
       super(UserForm,self).__init__(*args, **kwargs)
       attrs={'class':'form-control','required': True}
       if self.instance and self.instance.pk:
            self.fields.pop('password', None)
       for field in self.fields.values():
           field.widget.attrs = attrs

   class Meta:
       model=User
       fields=['email','password']