我有一个使用多个模型的表单,它们有关系。如果其中一个表单的数据与现有条目匹配,我希望将外键映射到现有条目,而不是创建重复条目。但是,对于现有的条目,is_valid()失败,我不确定在清除表单数据之前是否可以安全地首先进行数据库查找。也许我需要更改clean函数以忽略唯一性要求,然后在视图中处理它?</ p>
以下是一个示例,用户在网络表单中输入他们的姓名,城市和州。如果数据库已知该城市,则该人的外键应仅指向现有条目。如果是新城市,则应将其添加到数据库中。所以它始终是人的创造,但它可能是也可能不是故乡的创造。
models.py
class Person(models.Model):
name = models.CharField()
hometown = models.ForeignKey('Hometown')
class Hometown(models.Model):
cityName = models.CharField()
stateName = models.CharField()
mascot = models.CharField()
#If same city and state, it's the same place
class Meta:
unique_together = ("cityName", "stateName")
forms.py
class PersonForm(ModelForm):
class Meta:
model = Person
exclude = ('hometown')
class HometownForm(ModelForm):
class Meta:
model = Hometown
views.py
def newPerson(request):
if request.method == 'POST':
person = PersonForm(request.POST)
hometown = HometownForm(request.POST)
if (person.is_valid() and hometown.is_valid():
p = person.save(commit=False)
h = Hometown.objects.get_or_create(**hometown.cleaned_data)
p.hometown = h
p.save()
此代码不起作用,因为如果该城市/州对已经在数据库中,则hometown.is_valid()将为False。我应该覆盖clean()函数以允许忽略唯一性要求(通过使用get_or_create在视图中强制执行它),还是表明我的设计从根本上解决了这个问题的错误方法?
答案 0 :(得分:0)
stackoverflow上的类似问题包含了我需要的信息。 Free-form input for ForeignKey Field on a Django ModelForm
应用于我原来的问题,我删除了HometownForm,而是将相关字段添加到PersonForm,然后使PersonForm的save()函数处理Hometown的get_or_create()行为。