2013-01-12 43 views
1

一個的ModelForm相關對象的窗體我有兩個模型是這樣的:包括在Django的

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 s的表單,我只會使用它。有任何想法嗎?

回答

0

您可以通過Person訪問相關的House對象。因此,我會使用房屋對象作爲Modelform的實例。

HouseForm(ModelForm): 
    class Meta: 
     model = House 

假設你有一個與相關房屋保羅的Person對象。

house_form = HouseForm(instance=Paul.house) 

這是你在得到什麼?

+0

不完全是。我想要做的是創建一個PersonForm,但它包含幾乎爲HouseForm的一個子表單。 – peterw

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

依此類推。

+0

我可能最終會這樣做,我只是覺得可能會有更多的Django做事的方式。 – peterw

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> 
+0

你也應該重寫'has_changed()'函數。看起來像這樣: 'def has_changed(self):return(super(PersonForm,self).has_changed()or self.house_form.has_changed())'因爲沒有你的表單可能無法保存[Github] //github.com/django/django/blob/master/django/forms/models.py#L778) –