2013-06-18 72 views
0
动态表单

我有以下型号与外键在Django

class Make(models.Model): 
    make_name = models.CharField(max_length=32) 
    def __unicode__(self): 
     return self.book_title 

class MakeModel(models.Model): 
    model_number = models.IntegerField() 
    model_capacity = models.IntegerField() 
    model_capacity_unit = models.CharField(max_length=4) 
    Make = models.ForeignKey(Make) 
    def __unicode__(self): 
      return self.model_number 

基本上,我希望我的形式有顶部的所有制作细节,并在下方的网格中的所有MakeModel细节,并能够轻松添加更多的MakeModels。如本样机

https://www.dropbox.com/s/e7rg3zxe6y8q9fi/invoicedetails.gif

任何想法,需要做些什么事情?人们提到像inlineformset_factory这样的东西,但我并不确信如何使用它,或者它能做我期望的事情。

任何帮助,将不胜感激

回答

2

您需要一个窗体和一个formset。

  • 一种形式:一种形式
  • 一个formset:一种形式的多个副本

你的看法会是这个样子的POST周期:

更新:哦不对,外键。说实话的最简单的方法就是commit = False formset并手动分配FK。你也可以使用一个inlineformset。 https://docs.djangoproject.com/en/dev/ref/forms/models/#django.forms.models.inlineformset_factory

FormSet = modelformset_factory(MakeModel) 
Form = modelform_factory(Make) 

def myview(request): 
    formset = FormSet(request.POST or None) 
    form = Form(request.POST or None) 

    if request.method == 'POST':    
     if formset.is_valid() and form.is_valid(): 
      main_instance = form.save() 
      formset.save(commit=False) 
      for instance in formset: 
       instance.fk = main_instance 
       instance.save() 

https://docs.djangoproject.com/en/dev/topics/forms/formsets/

+1

你是个明星,谢谢。我仍然需要做一些游戏,但我觉得我很担心。 – user2167177