我被困在我的代码中。需要帮助。
这是我的前端。我正在渲染存储在" form_list"中的表单。 问题是存储的表单是相同类型的,因此产生具有相同" id"的输入字段。和#34;名称"。
这是我的看法: -
@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 %}
如何创建不同的&#34; id&#34;和不同的名字&#34;在for循环的输入标记的每次迭代中,自动地不知道form_list中没有存储的形式。 我试过{{forloop.counter}}它没有用,也许我犯了一些错误。另外,原始的python不能在模板中工作。
先谢谢。
答案 0 :(得分:1)
您创建表单的方式有两种方面是错误的。首先,第一个位置参数是用户提交的值;传递此arg会触发验证等。如果要传递显示值以预填充表单,则必须使用initial
kwarg:
current_form = VideoLinkForm(initial={...dict_of_values...})
但是,即使这在您的用例中也是不正确的。 link
是一个模型实例;你应该使用instance
kwarg:
current_form = VideoLinkForm(instance=link)
现在,为了解决您提出的问题,您可以按照我原先的建议传递prefix
:
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()