gpt4 book ai didi

python - 在for循环中更改django表单的ID

转载 作者:太空宇宙 更新时间:2023-11-03 15:53:09 29 4
gpt4 key购买 nike

我被困在我的代码中了。需要帮助。

这是我的前端。我正在渲染存储在“form_list”中的表单。问题是存储的表单具有相同的类型,因此产生具有相同“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 模板:-

{% for form in form_list %}
<div class="form-group">
<label for="id_video_link">Video Link:</label>
{{ form.video_link }}
</div>
{% endfor %}

如何在 for 循环输入标记的每次迭代中自动创建不同的“id”和不同的“名称”,而不需要知道 form_list 中没有存储任何表单。我尝试了 {{ forloop.counter}} 但没有成功,也许我犯了一些错误。另外,原始 python 不能在模板中工作。

提前致谢。

最佳答案

您创建表单的方式有两个错误。首先,第一个位置参数是用户提交的值;传递此参数会触发验证等。如果您要传递显示值以预填充表单,则必须使用 initial kwarg:

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

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

current_form = VideoLinkForm(instance=link)

现在,要解决您提出的问题,您只需传递一个前缀,就像我最初建议的那样:

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

但是,现在您已经显示了所有详细信息,我们可以看到这不是最好的方法。你有一个查询集;所以你应该简单地使用 model formset .

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

关于python - 在for循环中更改django表单的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41073028/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com