Django:为表单集中的每个表单创建多个实例

时间:2020-01-02 12:40:38

标签: django loops django-models django-forms django-views

我有2个模型:PostDatePost可以有多个Date,因此我对后者使用了formset。不出所料,提交表单后,我的视图在request.POST中包含多个Date。

但是,我仍然想根据Date的值为表单集中的每个表单创建male_total的多个实例。我尝试使用while循环创建多个Date实例(如下所示),但没有产生我想要的结果。

def create_post(request, method="POST"):
    DateFormSet = formset_factory(ExtraDateForm, extra=2, max_num=10, can_delete=True)
    if request.method == "GET":
        post_form = PostForm(request.GET or None)
        formset = DateFormSet(request.GET or None)
    elif request.method == "POST":
        post_form = PostForm(request.POST)
        formset = DateFormSet(request.POST)
        if post_form.is_valid() and formset.is_valid():
            post = post_form.save()
            for form in formset:
                male_total = form.cleaned_data['male_number']
                x = 0
                while x < male_total:
                    date = form.save(commit=False)
                    date.post = post
                    date.sex_of_professional = "Male"
                    date.save()
                    x += 1

是由于while循环还是实例化的方式?

1 个答案:

答案 0 :(得分:0)

问题出在您的迭代中。当您保存ModelForm中特定的FormSet时,您将创建模型的特定实例。换句话说:多次保存同一ModelForm不会给您多个实例。所以在你的

while x < male_total:
    date = form.save(commit=False)
    ....

您一次又一次地创建相同的Date实例。您需要使用表单中的cleaned_data来显式创建新实例,例如

while x < male_total:
    date = Date(
        post = post,
        **form.cleaned_data
        )
    date.save()

(您当然也可以使用** form.cleaned_data而不是** form.cleaned_data来显示字段)

while x < male_total:
    date = Date(
              post = post,
              field1 = form.cleaned_data['field1']
           )
    date.save()
相关问题