对于网页/网页开发,我有一个复杂且常见的必需场景。
所以我有三个模型,如下面
models.py
class model_a(models.Model):
name_a = models.CharField(max_length=256)
class model_b(models.Model):
forign_key_to_a = models.ForeignKey(model_a)
name_b = models.CharField(max_length=256)
class model_c(models.Model):
forign_key_to_b = models.ForeignKey(model_b)
name_c = models.CharField(max_length=256)
forms.py
class Aform(ModelForm):
model = model_a
class Bform(ModelForm):
model = model_b
class Cform(ModelForm):
model = model_c
所以我有模型和表单,现在我需要在一个页面中显示所有这些
First display Aform
Second display Bform
Here the user should be able to create multiple Bform's records for Aform
Third display Cform
here the user should be able to create multiple Cform's records for Bform
如果我的解释不好,我很抱歉,最后我的意图是添加model_a
这样的功能可以有多个model_b
记录,而model_b
可以有多个{{1}记录下面的内容(我无法向您展示设计,但我希望我解释了所需的功能)
name_a:
model_c
所以任何人都可以告诉我如何在一个页面上添加多个记录并使用单个按钮提交
为了通过动态创建表单将多个记录添加到模型我尝试使用 name_b(first record):
name_c(first record):
name_c(second record):
name_c(third record):
name_b(second record):
name_c(first record):
name_c(second record):
name_c(third record):
name_b(third record):
name_c(first record):
name_c(second record):
name_c(third record):
和jquery,我正面临着这个错误here(当然这是另一个问题,但是想让你知道在添加单个模型的多个记录的情况下我做了什么)
答案 0 :(得分:0)
您可以向上下文添加多个表单,并在模板中访问它们,如下所示:
<form action="" method="post">
{% csrf_token %}
{{ a_form.as_p }}
{{ b_form.as_p }}
{{ c_form.as_p }}
<input type="submit" value="Submit" />
</form>
然后在视图中你将它们拉出来如下:
a_form = Aform(request.POST)
b_form = Bform(request.POST)
c_form = Cform(request.POST)
编辑: 我只是重新阅读了你的问题,看到了关于页面上需要多个b_form和c_form的部分。您可以使用一些jQuery在需要时复制空白。
<button class="b_form_trigger">Add B Form</button>
<div class="hidden_b_form">{{b_form.as_p}}</div>
var b_form_counter = 0;
$('.b_form_trigger').click(function(){
$(TARGET_ELEMENT).append($('.hidden_b_form > *').clone());
// Then you will need to rename all of the inputs
$(TARGET_ELEMENT).find('input').each(function(){
// Need to add a prefix to the name field so we know what form we have.
$(this).attr('name', 'b-form-'+b_form_counter+$(this).attr('name'));
});
});
然后在views.py文件中,您可以访问以下每个表单:
counter = 0
b_forms = []
while 'b-form-%sname_c' % counter in request.POST:
b_forms.append(Bform(request.POST, prefix="b-form-%s" % counter))
counter += 1
您可能希望做一些更强大的功能来支持添加和删除表单,但这是我过去能够做到的。