1

我有一个表单,我在模板的嵌套 for 循环中调用它。

这是forms.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)

视图.py

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)

在模板中(没有 html):

{{ 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 %}

问题:我不知道如何将表单字段 id 设置为唯一。因为子类别中可能有多达 15 个这种形式。具体来说,描述表单字段需要一个唯一的 id。表单发布并保存,但从 CKEditorWidget 得到一个烦人的 js 错误:

Uncaught The editor instance "id_description" is already attached to the provided element.

我可以通过编辑 js 来抑制这一点,但很高兴知道是否有任何方法可以动态设置字段 id。

4

3 回答 3

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

于 2020-08-19T17:44:15.370 回答
1

使用表单集

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.

于 2017-06-23T13:33:50.457 回答
1

您应该使用一个表单集来处理为多个表单生成唯一 ID。

此处的 Django Formset 文档 https://docs.djangoproject.com/en/1.11/topics/forms/formsets/#module-django.forms.formsets

于 2017-06-23T13:27:22.817 回答