使用小部件修改 django 模型表单字段

Modify django model form field with widget

我想修改model表单中的一些字段,找到了两个方法:

第一种方法:

class ProfileForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['bio'].widget.attrs.update({'placeholder': 'Enter your bio here'})

    class Meta:
        model = Profile
        fields = ['bio']

第二种方法:

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['bio']
        widgets = {
            'bio': Textarea(attrs={'placeholder': 'Enter your bio here'})

我只想知道他们是一样的吗? 哪个更好? 或者还有其他更好的方法吗?

谢谢。

方法一

第一个方法在 之前调用构造函数 super().__init__(*args, **kwargs) 来操作字段。这使开发人员能够在默认状态下构建 class,然后使用 classes 组件(a 属性、函数).

如果开发人员无法在第二种方法中获得他们想要的结果,则最常使用第一种方法。这是因为您正在从配置转向对 class.

的更多操作

方法二

第二种方法允许开发人员在 class 实例化之前定义其配置。这通常会为其他开发人员提供更好的可用性和可读性。


示例:

假设您希望您的字段 bio 成为除超级用户之外的所有普通用户的必填字段。

class ProfileForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop(user, None)
        super().__init__(*args, **kwargs)
        if self.user.is_superuser():
            self.fields['bio'].required = False

    class Meta:
        model = Profile
        fields = ['bio']

使用此方法,您可以允许 Profile 模型的 bio 字段属性在实例化时转换为表单字段,然后进行小的调整以确定该特定用户是否需要它。这可以在不重新定义整个字段的情况下完成。

Note: The form call in the GET request would look like ProfileForm(user=request.user)