我有一个表单,我在模板中的嵌套for循环中调用它。
这里有form.py
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<title>AngularJS Plunker</title>
<script data-require="angular.js@1.4.x" src="https://code.angularjs.org/1.4.12/angular.js" data-semver="1.4.9"></script>
</head>
<body ng-controller="MainCtrl">
<h1> User Details </h1>
<h3> {{userDetails}} </h3>
</body>
</html>
views.py
class SubCategoryItemForm(forms.Form):
paragraf = forms.CharField(widget=forms.TextInput(attrs={'class' : 'form-control'}), required=True, label="Paragraf")
name = forms.CharField(widget=forms.TextInput(attrs={'class' : 'form-control'}), required=True)
description = forms.CharField(widget=CKEditorWidget(attrs={'class' : 'form-control'}), required=True)
在模板中(没有html):
def category_view(request, cat_id):
category = Category.objects.get(id=cat_id)
context = {"category": category, "sub_category_item_form": SubCategoryItemForm()}
return render(request, 'registered/category.html', context=context)
问题: 我不知道如何将表单字段ID设置为唯一。因为子类别中最多可能有15个此表单。具体而言,描述表单字段需要唯一的id。表单发布并保存,但从CKEditorWidget中获取恼人的js错误:
{{ category.name }}
{{ category.description }}
{% for subcat in category.foreign_category.all %}
{{ subcat.name }}
{{ subcat.description }}
<form role="form" id="{{ subcat.id }}" action="{% url 'auth_sub_category_item_add' %}" method="POST">
{% csrf_token %}
{{ sub_category_item_form }}
<button type="submit">Save</button>
</form>
{% endfor %}
我可以通过编辑js来抑制这种情况,但是知道是否有任何方法可以动态设置字段ID会很好。
答案 0 :(得分:2)
在这种情况下,实际上并不需要您使用唯一的ID。如果您没有收集要用于每个表单字段的ID,则可以简单地在表单实例中调用auto_id=False
,以确保没有任何字段添加自动ID属性。
例如:
def category_view(request, cat_id):
# note auto_id=False
form = SubCategoryItemForm(auto_id=False)
category = Category.objects.get(id=cat_id)
context = {"category": category, "sub_category_item_form": form}
return render(request, 'registered/category.html', context=context)
这在Django文档中有描述:
https://docs.djangoproject.com/en/3.1/ref/forms/api/#django.forms.Form.auto_id
答案 1 :(得分:0)
您应该使用一个formset来处理为多个表单生成唯一ID。
Django Formset的文档 https://docs.djangoproject.com/en/1.11/topics/forms/formsets/#module-django.forms.formsets
答案 2 :(得分:0)
使用formsets:
forms.py
中的:
from django.forms import formset_factory
SubCategoryItemFormSet = formset_factory(SubCategoryItemForm)
views.py
中的:
def category_view(request, cat_id):
category = Category.objects.get(id=cat_id)
categories_formset = SubCategoryItemFormSet(initial=category.foreign_category.all().values())
context = {"category": category, "categories_formset": categories_formset}
return render(request, 'registered/category.html', context=context)
在模板中:
<form role="form" id="{{ category.id }}" action="{% url 'auth_sub_category_item_add' %}" method="POST">
<table>
{{ categories_formset }}
</table>
</form>
请注意,在view
中,您需要处理完整的FormSet
,而不仅仅是一个子类别。 Django负责映射表单中的每个元素。
更好的是,您可以使用ModelFormSet
。