我有两个这样的模型:
class Person(models.Model):
name = models.CharField(max_length=100)
house = models.ForeignKey('House')
class House(models.Model):
address = models.TextField()
是否有某种方法可以为Person
创建模型表单并让它包含内联表单来编辑相关的House
对象?根据我对内联表单集的理解,我只会使用它,如果我有一个表单编辑House
,我想显示所有相关Person
的表单。有什么想法吗?
答案 0 :(得分:6)
将HouseForm粘贴到PersonForm中,将其作为clean()过程的一部分进行评估,并将其保存为save()过程的一部分。也适用于modelformset。
class HouseForm(forms.modelForm):
""" Edit a house """
class Meta:
model = House
exclude = ()
class PersonForm(forms.ModelForm):
""" Edit a person and her house """
class Meta:
model = Person
exclude = ()
def __init__(self, *args, **kwargs):
super(PersonForm, self).__init__(*args, **kwargs)
self.fields['house'].required = False
data = kwargs.get('data')
# 'prefix' parameter required if in a modelFormset
self.house_form = HouseForm(instance=self.instance and self.instance.house,
prefix=self.prefix, data=data)
def clean(self):
if not self.house_form.is_valid():
raise forms.ValidationError("House not valid")
def save(self, commit=True):
obj = super(PersonForm, self).save(commit=commit)
obj.house = self.house_form.save()
obj.save()
然后在你的标记中:
<form ...>
{{ person_form }}
{{ person_form.house_form }}
</form>
答案 1 :(得分:0)
您可以通过Person访问相关的House对象。因此,我会使用house对象作为Modelform的实例。
HouseForm(ModelForm):
class Meta:
model = House
假设你有一个保罗的人物对象与相关的房子。
house_form = HouseForm(instance=Paul.house)
这是你得到的吗?
答案 2 :(得分:0)
我不确定这是否是解决问题的最佳方式,但我会这样做:
从每个模型中定义ModelForm
:
class PersonForm(ModelForm):
class Meta:
model = Person
class HouseForm(ModelForm):
class Meta:
model = House
定义像这样的模板,输出两种形式:
<form action="" method="post">
<table>
{{ form1 }}
{{ form2 }}
</table>
<input type="submit">
</form>
创建表单以编辑两个模型中的信息的视图。
def edit(request):
# You could grab the id from the request that calls the edit form
p = models.Person.objects.get(pk=request.GET.get('id'))
h = models.House.objects.get(pk=p.house.id)
return render_to_response('template.html',
RequestContext(request,
{'form1': PersonForm(instance=p), 'form2': HouseForm(instance=h)}
)
)
等等。