在for循环中更改django表单的Id

时间:2016-12-10 06:56:52

标签: python html django django-templates

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

这是我的前端。我正在渲染存储在" 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不能在模板中工作。

先谢谢。

1 个答案:

答案 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()