【发布时间】:2015-03-03 19:45:10
【问题描述】:
我有一个带有 ManyToManyField 的 Django 模型。我需要要求用户在此字段中至少选择一个 M2M 值。
我尝试将 blank=False 设置为 M2M 字段,但没有帮助。
class Skill(models.Model):
name = models.CharField(max_length=200)
class PersonSkills(models.Model):
person = models.ForeignKey('Person')
skill = models.ForeignKey('Skill')
class Person(models.Model):
name = models.CharField(max_length=200)
skills = models.ManyToManyField('Skill', through='PersonSkills')
p = Person(name='Bob')
p.save()
# success, but I expect that this should throw ValidationError, because I didn't select at least one Skill for this person
我可以使用自定义Form 定义或覆盖save() 方法来解决这种情况Person 模型。
如果没有选择至少一个Skill 并设置ManyToManyField 选项,是否可以防止创建Person?或者我需要创建自定义逻辑来处理这种情况?谢谢。
我使用Django 1.7 和Python 3.4
更新1.如何创建ModelForm来控制M2M?因为在cleaned_data 中,我只有为Person 表单传递的字段,而没有作为M2M 字段传递的数据。我尝试在管理站点中创建对象并控制 Skills 选择。我通过inline输入Skill。
# admin.py
class PersonSkillsInline(admin.TabularInline):
model = Person.skills.through
extra = 2
class PersonAdmin(admin.ModelAdmin):
inlines = [PersonSkillsInline]
admin.site.register(Person, PersonAdmin)
【问题讨论】:
-
您需要通过 Person 的 ModelForm 类确保至少有一个值。
-
@Brandon 我同意。但是,如果我尝试在不使用自定义
Form的情况下创建Person对象,这将允许我在未选择Skill的情况下创建用户:-( -
您还希望如何创建记录?我不太明白你为什么不使用 ModelForm...
-
@Brandon 谢谢。我没想到我们使用了中间模型,其中指定了两个
ForeignKey字段。在这种情况下,我无法通过将选项传递给 M2M 字段来控制 M2M 字段。我将使用带有clean()方法的ModelForm 来检查skills是否通过。 -
我已经更新了我的问题。弄清楚如何使用管理站点并检查技能对象的计数作为内联对象。
标签: python python-3.x django django-admin many-to-many