独特的id表单字段django

时间:2017-06-23 13:11:07

标签: django django-forms django-ckeditor

我有一个表单,我在模板中的嵌套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会很好。

3 个答案:

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