2

我有两个这样的模型:

class Person(models.Model):
    name = models.CharField(max_length=100)
    house = models.ForeignKey('House')

class House(models.Model):
    address = models.TextField()

有没有办法为它创建一个模型表单Person并让它包含内联表单以编辑相关House对象?House根据我对内联表单集的了解,如果我有一个编辑 a 的表单并且我想显示所有相关Persons的表单,我只会使用它。有任何想法吗?

4

3 回答 3

8

只需将 HouseForm 粘贴到 PersonForm 中,将其作为 clean() 过程的一部分进行评估,然后将其保存为 save() 过程的一部分。也可以在模型集中工作。

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>
于 2015-06-03T00:09:57.323 回答
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)}
        )
    )

等等。

于 2013-01-13T01:59:42.777 回答
0

您可以通过 Person 访问相关的 House 对象。因此,我将使用房屋对象作为 Modelform 的实例。

HouseForm(ModelForm):
    class Meta:
        model = House

假设你有一个 Paul 的 Person 对象和一个相关的 House。

house_form = HouseForm(instance=Paul.house)

这就是你的意思吗?

于 2013-01-12T21:06:21.890 回答