【问题标题】:django many2many field make not requireddjango many2many 字段不需要
【发布时间】:2026-02-22 21:50:01
【问题描述】:

我根据模型创建了一个表单。该模型有一个 many2many 字段。我这样定义字段:

contacts = models.ManyToManyField(Contact, blank=True, null=True)

我现在想知道为什么生成的表单说该字段不能为空。当我没有为联系人字段选择联系人时,我总是收到错误消息“此字段是必需的。”。

怎么了?

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    在您的表单声明中将此字段标记为required=False

    class MyForm(forms.ModelForm):
      contacts=forms.ModelMultipleChoiceField(queryset=Contact.objects.all(),required=False)
      class Meta:
        model=MyModel
    

    【讨论】:

    • 你知道我是否要过滤具有限制的联系人,它应该只显示与当前表单实例相关的,我的意思是它应该显示与业务相关的联系人而不是全部。对于新表单应该为空,queryset=Contact.objects.filter(Contact.objects.filter(self.instance.????)
    【解决方案2】:

    您可能在添加blank=True, null=True 之前添加了syncdb

    syncdb 只会在数据库中不存在表时创建表。必须直接使用 SQL 或使用迁移工具(例如 South)在数据库中手动更改模型。

    当然,如果你还处于早期开发阶段,删除数据库并再次运行syncdb会更容易。

    【讨论】:

    • 不,我确实运行了syncdb。我也确实运行了 django evolution code.google.com/p/django-evolution。我也认为这是问题所在。也许一滴是个好主意。
    【解决方案3】:

    您对 null=True 的使用在这里令人困惑。 manyToMany 字段导致第三个表将一个模型与另一个模型相关联。例如

    Business <-> Contact
    

    如果business.contacts 为空,则不会在此表中输入任何记录。 null=True 会让我觉得您打算将 NULL 记录添加到此表中,这似乎无效。

    通常您会关闭两个这些属性。

    【讨论】:

    • 好的,但是如果我关闭这两个属性,它们是必需的。实际上,如果用户必须添加至少一个 m2m 关系,这不是什么大问题,但如何实现这一点仍然很有趣。