django:如何从包含外键的多个模型中制作一个表单

Posted

技术标签:

【中文标题】django:如何从包含外键的多个模型中制作一个表单【英文标题】:django: How to make one form from multiple models containing foreignkeys 【发布时间】:2011-03-05 02:01:16 【问题描述】:

我正在尝试在一个页面上制作一个使用多个模型的表单。模型相互引用。我无法验证表单,因为我无法弄清楚如何将表单中使用的两个模型的 id 放入表单中以对其进行验证。我在模板中使用了一个隐藏键,但我不知道如何让它在视图中工作

我的代码如下:

观看次数:

def the_view(request, a_id,):

  if request.method == 'POST':

     b_form= BForm(request.POST)
     c_form =CForm(request.POST)
     print "post"
     if b_form.is_valid() and c_form.is_valid():
        print "valid"
        b_form.save()
        c_form.save()
        return HttpResponseRedirect(reverse('myproj.pro.views.this_page'))
  else:
     b_form= BForm()
     c_form = CForm()
     b_ide = B.objects.get(pk=request.b_id)
     id_of_a = A.objects.get(pk=a_id)
  return render_to_response('myproj/a/c.html', 
'b_form':b_form, 
 'c_form':c_form, 
 'id_of_a':id_of_a, 
  'b_id':b_ide     )

型号

class A(models.Model):
    name = models.CharField(max_length=256, null=True, blank=True)
    classe = models.CharField(max_length=256, null=True, blank=True)

   def __str__(self):
      return self.name


class B(models.Model):

    aid = models.ForeignKey(A, null=True, blank=True)
    number =  models.IntegerField(max_length=1000)
    other_number =  models.IntegerField(max_length=1000)


class C(models.Model):
   bid = models.ForeignKey(B, null=False, blank=False)
   field_name = models.CharField(max_length=15)
   field_value = models.CharField(max_length=256, null=True, blank=True)

表格

from mappamundi.mappa.models import A, B, C


class BForm(forms.ModelForm):
   class Meta:
     model = B
     exclude = ('aid',)

class CForm(forms.ModelForm):
   class Meta:
     model = C
     exclude = ('bid',)

B 有一个对 A 的外键引用,C 有一个对 B 的外键引用。由于模型是相关的,我希望它们的表单在一页上,1 个提交按钮。由于我需要为 B 和 C 的表单填写字段,并且我不想从下拉列表中选择 B 的 id,因此我需要以某种方式将 B 表单的 id 放入表单中以便验证。我在模板中有一个隐藏字段,我只需要在视图中弄清楚如何做到这一点

【问题讨论】:

您能否再解释一下您究竟想要实现什么,在页面上显示这两个表单的目的是什么?您的意思是需要根据用户正在查看的页面设置 ForeignKey 字段吗? 【参考方案1】:

您的代码几乎是正确的。做吧:

if b_form.is_valid() and c_form.is_valid():
    print "valid"
    b = b_form.save()
    c = c_form.save(commit=False)
    c.b = b
    c.save()

【讨论】:

以上是关于django:如何从包含外键的多个模型中制作一个表单的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django的同一个表中阻止外键的相同对象引用?

书签实现逻辑django

如何使用 Django 中同一个表的多个外键来管理删除?

如何获取Django中子模型中存在外键的父模型的所有对象?

Python:如何在我的 Django 模板中传递外键的值?

如何在不同的数据库中使用带有外键的 django 模型?