在for循环中更改Django窗体的Id

2024-04-29 14:13:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我被我的代码卡住了。需要帮助。在

这是我的前端。我正在呈现存储在“表单列表”中的表单。 问题是存储的表单类型相同,因此生成的输入字段具有相同的“id”和“name”。在

这是我的视图:-在

@login_required
def VideoLinkView(request):
    """view to save the video links """
    current_form_list = []
    current_form = None
    if request.method == 'GET':
        vl = VideoLink.objects.filter(company=CompanyModel.objects.get(owner=request.user))
        for link in vl:
            current_form = VideoLinkForm(link.__dict__)
            current_form_list.append(current_form)
        return render(request, "premium/video_link.html", context={'form_list':current_form_list})

这是我的html模板:-

^{pr2}$

如何在for循环的输入标记的每次迭代中创建不同的“id”和不同的“name”,而不必知道表单列表中没有存储表单。 我试过{forloop.计数器}}没用,也许是我弄错了。另外,原始python在模板中不起作用。在

提前谢谢。在


Tags: nameform模板id表单列表forobjects
1条回答
网友
1楼 · 发布于 2024-04-29 14:13:27

您创建表单的方式在两个方面是错误的。首先,第一个位置参数用于用户提交的值;传递这个参数将触发验证,等等。如果要传递display值以预填充表单,则必须使用initialkwarg:

current_form = VideoLinkForm(initial={...dict_of_values...})

然而,即使这样对您的用例来说也是不正确的。link是一个模型实例;您应该使用instancekwarg:

^{pr2}$

现在,要解决您所问的问题,您可以按照我最初的建议传递一个prefix

for i, link in enumerate(vl):
    current_form = VideoLinkForm(instance=link, prefix="link{}".format(i))

但是,既然你已经展示了所有细节,我们可以看出这不是最好的方法。您有一个queryset;所以您只需使用一个model formset。在

from django.forms import modelformset_factory
VideoLinkFormSet = modelformset_factory(VideoLink, form=VideoLinkForm, queryset=vl)
current_form_list = VideoLinkFormSet()

相关问题 更多 >