Django 如何排除单个 modelForm 中的字段,仅用于 updateview 而不是 createview?

Django How to exclude field in a single modelForm for only updateview but not createview?

我有一个表单 class 就像 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 个表单来创建和更新 **

提前致谢

您正在使用模型表单。因此,您可以覆盖方法 __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']