0

在网页/网络开发的情况下,我有一个复杂且常见的必需场景。

所以我有如下三个模型

模型.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)

表格.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可以有多个model_c记录,如下所示(我无法向您展示设计,但我希望我解释了所需的功能)

name_a :

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

那么任何人都可以让我如何在单个页面上添加多个记录并使用单个按钮提交

为了通过动态创建表单将多条记录添加到模型中,我尝试使用Django Formsets和 jquery,我在这里遇到了这个错误(当然这是另一个问题,但想让你知道我在添加多条记录的情况下做了什么对于单个模型)

4

1 回答 1

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

您可能想要做一些更强大的事情来支持添加和删除表单,但这就是我过去能够做到这一点的方式。

于 2013-10-26T11:47:14.467 回答