如何防止django字段被 Package 在`div`中?

eqoofvh9  于 2023-03-24  发布在  Go
关注(0)|答案(1)|浏览(83)

如果我使用下面的来生成多个单选按钮:

from django import forms

class MCQCollectionForm(forms.Form):
    user_input = forms.ChoiceField(
        widget=forms.RadioSelect, label='', choices=enumerate(['option 1', 'option 2'])
    )

我得到:

<div id="id_user_input">
    <div>
        <label for="id_user_input_0"><input id="id_user_input_0" name="user_input" required="" type="radio"
                                            value="0">
            option 1</label>

    </div>
    <div>
        <label for="id_user_input_1"><input id="id_user_input_1" name="user_input" required="" type="radio"
                                            value="1">
            option 2</label>

    </div>
</div>

但我只希望它是下面的,没有别的:

<label class="user-item">
    <input name="user_input" type="radio" ... >
    <span>Lorem ipsum dolor</span>
</label>
<label class="user-item">
    <input name="user_input" type="radio" ... >
    <span>Lorem ipsum dolor</span>
</label>

有没有一种简单的方法,不用使用JS,手动进行所需的更改?注意:额外的属性id=...required,...都很好,我只是希望div消失,并能够设置标签的类user-itemspan与其内容.

dsekswqp

dsekswqp1#

您可以通过使用从forms.RadioSelect继承的自定义小部件并覆盖方法create_option来实现这一点

在您的forms.py文件中添加此自定义小部件类。

class CustomRadioSelect(forms.RadioSelect):
    def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
        option = super().create_option(name, value, label, selected, index, subindex, attrs)
        option["wrapper_attrs"] = {}
        if "label_attrs" not in option:
            option["label_attrs"] = {}
        option["label_attrs"]["class"] = "user-item"
        return option

现在,使用以下内容更新MCQCollectionForm类:

class MCQCollectionForm(forms.Form):
    user_input = forms.ChoiceField(
        widget=CustomRadioSelect, label='', choices=enumerate(['option 1', 'option 2'])
    )

views.py文件中,通过适当的视图上下文传递表单,如下所示:form = MCQCollectionForm() render(.....,{'form':form})(我相信你已经有了这个地方)

从您的模板文件循环通过表单字段,如下所示:

{% for choice in form1.user_input %}
    <label class="{{ choice.label.attrs.class }}" for="{{ choice.id_for_label }}">
    {{ choice.tag }}
       <span>{{ choice.choice_label }}</span>
     </label>
{% endfor %}

这将帮助你实现你的目标。下面是一个屏幕截图,它将如何在HTML源代码格式。

相关问题