Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中为表单集中的每个表单赋值_Django_Forms_Dynamic_Formset - Fatal编程技术网

在Django中为表单集中的每个表单赋值

在Django中为表单集中的每个表单赋值,django,forms,dynamic,formset,Django,Forms,Dynamic,Formset,我试图创建一个表单集,每个表单集都包含一个输入字段。这将有一些动态数量的元素,一旦表单提交,输入的文本将作为“标签”分配给相关对象。这听起来可能有点让人困惑,所以让我们看看我试图创建的表单类: class TagsForm(forms.Form): tags = forms.CharField() def __init__(self, *args, **kwargs): applicantId = kwargs.pop('applicantId') d

我试图创建一个表单集,每个表单集都包含一个输入字段。这将有一些动态数量的元素,一旦表单提交,输入的文本将作为“标签”分配给相关对象。这听起来可能有点让人困惑,所以让我们看看我试图创建的表单类:

class TagsForm(forms.Form):

    tags = forms.CharField()
    def __init__(self, *args, **kwargs):
        applicantId = kwargs.pop('applicantId')

    def saveTags(self):
        applicant = Applicants.objects.get(id=applicantId)
        Tag.update(applicant,tags)
如您所见,我希望将表单传递给申请者的id,然后在收到post请求后,通过调用每个表单saveTags来更新该申请者对象的标记。以下是我处理此问题时的代码:

    ...
    applicantQuery = allApplicantsQuery.filter(**kwargs)
    TagsFormSet = formset_factory(TagsForm)
    if request.method == 'POST':
        tags_formset = TagsFormSet(request.POST, request.FILES, prefix='tags')
        if tags_formset.is_valid()
            for tagForm in tags_formset:
                tagForm.saveTags()
    else:
        tags_formset = TagsFormSet(prefix='tags')
    ...

问题是我不知道如何从applicationquery查询集中创建id为的初始表单集。理想情况下,我可以循环查询集并将applicator.id发送到每个表单,但我不确定如何做到这一点。我还觉得我应该提到的是,表单集的数量应该与applicationsquery中的申请者完全相同。

您可以编写自定义表单集

from django.forms.formsets import BaseFormSet

class TagFormSet(BaseFormSet):

    def __init__(self, *args, **kwargs):
        applicants = kwargs.pop('applicants')
        super(TagFormSet, self).__init__(*args, **kwargs)
        #after call to super, self.forms is populated with the forms

        #associating first form with first applicant, second form with second applicant and so on
        for index, form in enumerate(self.forms):
            form.applicant = applicants[index]
现在您不需要重写TagsForm的
\uuuu init\uuuu

现在,您的每个表单都与一个申请人关联。因此,您可以删除
saveTags()
的第一行。因此saveTags()变成:

您的视图代码:

applicantQuery = allApplicantsQuery.filter(**kwargs)

#notice we will use our custom formset now
#also you need to provide `extra` keyword argument so that formset will contain as many forms as the number of applicants
TagsFormSet = formset_factory(TagsForm, formset=TagFormSet, extra=applicantQuery.count())

if request.method == 'POST':
    tags_formset = TagsFormSet(request.POST, request.FILES, prefix='tags', applicants=applicantQuery)
    if tags_formset.is_valid()
        for tagForm in tags_formset:
            tagForm.saveTags()
else:
    tags_formset = TagsFormSet(prefix='tags', applicants=applicantQuery)

哇,这太完美了!非常感谢。
applicantQuery = allApplicantsQuery.filter(**kwargs)

#notice we will use our custom formset now
#also you need to provide `extra` keyword argument so that formset will contain as many forms as the number of applicants
TagsFormSet = formset_factory(TagsForm, formset=TagFormSet, extra=applicantQuery.count())

if request.method == 'POST':
    tags_formset = TagsFormSet(request.POST, request.FILES, prefix='tags', applicants=applicantQuery)
    if tags_formset.is_valid()
        for tagForm in tags_formset:
            tagForm.saveTags()
else:
    tags_formset = TagsFormSet(prefix='tags', applicants=applicantQuery)