当admin.py中的字段为readonly时,模型字段blank = false不起作用

时间:2014-04-23 10:29:42

标签: python django forms django-admin dry

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

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是实现这项工作的唯一方法吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

    方式#2:

    class MyForm(forms.ModelForm):
        model = MyModel
    
        field = forms.Charfield(required=False)
    

    哪种方式更好?

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

答案 1 :(得分:1)

您可能需要阅读此source

来自接受的答案

null=True在您的数据库中的列上设置NULL(与NOT NULL)。 Django字段类型(如DateTimeField或ForeignKey)的空白值将作为NULL存储在数据库中。

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

另外

来自source

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

<强>更新

至于解决问题,您可以在模型中将其排除,或将字段设置为required = False。更多关于此source