使用小部件修改 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)
我想修改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)