【问题标题】:Model field blank=false doesn't work when field is readonly in admin.py当字段在 admin.py 中为只读时,模型字段空白 = false 不起作用
【发布时间】:2014-06-08 03:04:04
【问题描述】:

我在其中一个模型中有一个字段,例如:

field = models.CharField(max_length=10, null=True)

在 admin.py 我有

readonly_fields = ('field',)

当我尝试从管理员那里保存它时,它不会抛出一个非常正常的验证错误。

但如果我尝试在我的 views.py 中这样做,

form = MyForm(#some data here from request.POST)
print form.is_valid()

我收到错误提示:

'this field is required'

这里的MyForm 是该型号的ModelForm。我正在尝试创建另一个表单来替换管理员表单,以便我的团队可以使用我创建的新表单而不是管理员。

我想通过我已经编写的ModelForm 运行该表单,并且我不想重复代码并重新编写验证。

为什么管理表单和任何其他表单之间的这种行为不同? 在我的模型中说blank=True 是实现这项工作的唯一方法吗?

【问题讨论】:

  • 如果您的字段是只读的,请尝试在您的模型表单中排除它

标签: python django forms django-admin dry


【解决方案1】:

有两种方法可以解决这个问题。在你的ModelForm

  1. 要么排除该字段。
  2. 或将其设置为required=False

方式#1:

class MyForm(forms.ModelForm):
    model = MyModel
    exclude = ['field']

方式#2:

class MyForm(forms.ModelForm):
    model = MyModel

    field = forms.Charfield(required=False)

哪种方式更好?

如果您不希望 field 可编辑,您应该使用 方式 #1。但如果您希望此字段可编辑但不是必需,请使用方式#2

【讨论】:

    【解决方案2】:

    您可能想阅读此source

    来自接受的答案

    null=True 在数据库的列上设置NULL(相对于NOT NULL)。 DateTimeField 或 ForeignKey 等 Django 字段类型的空白值将在 DB 中存储为 NULL

    blank=True 确定表单中是否需要该字段。这包括管理员和您自己的自定义表单。如果 blank=True 则不需要该字段,如果为 False 则该字段不能为空。

    另外

    来自source

    readonly_fields 将被排除在用于在管理员中创建和编辑的 ModelForm 中。

    更新

    至于解决您的问题,您可以在您的模型表单中排除它或将字段设置为 required=False。更多信息在这里source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多