【问题标题】:Changing max_length on a CharField for a ModelForm更改 ModelForm 的 CharField 上的 max_length
【发布时间】:2020-09-05 19:36:04
【问题描述】:

我在模型定义中将字段的 max_length 定义为 50。创建表单时,它需要这些属性来创建字段,但我想覆盖该特定表单的 max_length 而不更改模型本身。

这就是我的模型中的内容

text_field01 = models.CharField(max_length=50, default="")
text_field02 = models.CharField(max_length=50, default="")

我尝试使用 forms.py 中的新小部件覆盖小部件,但这引发了错误。我也在 init 中尝试过,但这似乎没有效果。我有点卡住了,任何帮助将不胜感激。

编辑

起初我尝试在元类中设置小部件,如下所示。

widgets = {
'text_field01': forms.CharField(max_length=10)

这产生了一个错误“CharField”对象没有属性“is_hidden”

然后我尝试在 init 中进行操作,如下所示。

        def __init__(self, *args, **kwargs):
            super(AutomationForm, self).__init__(data=data, files=files, *args, **kwargs)
            if self.instance:
                if self.fields['text_field01']:
                    self.fields['text_field01'].max_length = 2

这根本没有效果。

【问题讨论】:

  • 你能说明你在ModelForm中做了什么吗?
  • @WillemVanOnsem 检查编辑
  • CharField 不是一个小部件,而是一个表单域。小部件是您在 html 中呈现它的方式,FormField 是表单验证它的方式。给定的 anwser 有帮助吗?
  • 这有助于我理解为什么我在尝试通过小部件进行简单更改时收到错误但我仍然不确定如何解决我的问题。
  • 不,因为小部件不验证max_length,所以构造了一个小部件以在页面上呈现类似<input ...> 的内容(并使用表单字段来获取相关信息)。

标签: django python-3.x django-forms


【解决方案1】:

您可以创建一个ModelForm,并覆盖max_length=… parameter [Django-doc] 的值:

class MyModelForm(forms.ModelForm):
    text_field01 = forms.CharField(max_length=25)

    class Meta:
        model = MyModel
        fields = '__all__'

您在ModelForm 中定义的max_length 只能小于或等于Model 本身中的值,因为模型中的验证也必须成功。

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2011-03-13
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2019-03-26
    • 2012-08-27
    相关资源
    最近更新 更多