【问题标题】:Unique id form field django唯一 id 表单字段 django
【发布时间】:2017-11-27 02:03:45
【问题描述】:

我有一个表单,我在模板的嵌套 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)

views.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,那就太好了。

【问题讨论】:

    标签: django django-forms django-ckeditor


    【解决方案1】:

    您应该使用一个可以为多个表单生成唯一 ID 的表单集。

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

    【讨论】:

      【解决方案2】:

      使用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

      【讨论】:

      • 太棒了,我从你的例子中得到了它。非常感谢,点赞!
      【解决方案3】:

      在这种情况下,您实际上并不需要使用唯一 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2018-04-21
        • 2011-04-09
        • 2013-05-31
        • 2014-10-10
        相关资源
        最近更新 更多