在Django的modelform中包含相关对象的表单

时间:2013-01-12 18:08:37

标签: django django-forms

我有两个这样的模型:

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的表单。有什么想法吗?

3 个答案:

答案 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)}
        )
    )

等等。