Django中具有外键的动态表单

时间:2013-06-18 16:09:16

标签: django forms

我有以下型号

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

基本上,我希望我的表单在顶部包含所有Make详细信息,并在下面的网格中包含所有MakeModel详细信息,并且能够轻松添加更多MakeModel。比如在这个模型中

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

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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

您需要一个表单和一个formset。

  • 表格:一种表格
  • 表单集:一个表单的多个副本

您的视图在POST周期中看起来像这样:

更新:哦,对,外键。诚实的最简单方法就是将form = False设置为False并手动分配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/