在我的 Django 2.2.6 上面的解决方案上效果不佳,所以我在多次尝试后发布我的解决方案,并按照面包屑导航,直到使用 django 表单小部件模板。
我必须重写 2 个模板,继承我自己的小部件类,然后指向它。
修改后的默认django模板为:
- django/forms/templates/django/forms/widgets/input_option.html
- django/forms/templates/django/forms/widgets/multiple_input.html
现在他们是:
PROJECT_NAME/PROJECT_APP/templates/admin/horizontal_option.html
{% if widget.wrap_label %}<label{% if widget.attrs.id %} for="{{ widget.attrs.id }}"{% endif %} class="radio-inline">{% endif %}{% include "django/forms/widgets/input.html" %}{% if widget.wrap_label %} {{ widget.label }}</label>{% endif %}
PROJECT_NAME/PROJECT_APP/templates/admin/horizontal_radios.html
{% with id=widget.attrs.id %}<ul{% if id %} id="{{ id }}"{% endif %}{% if widget.attrs.class %} class="{{ widget.attrs.class }}"{% endif %}>{% for group, options, index in widget.optgroups %}{% if group %}
<li>{{ group }}
<ul{% if id %} id="{{ id }}_{{ index }}"{% endif %}>{% endif %}{% for option in options %}
{% include option.template_name with widget=option %}{% endfor %}{% if group %}
</ul></li>{% endif %}{% endfor %}
</ul>{% endwith %}
- 第一个包含一个硬编码的类:
class="radio-inline" at labels,默认情况下 Django 什么都没有
- 第二个是无线电组的呈现,我删除了它们在内部 ul 标记中呈现的额外 HTML li 标记。
然后你需要创建自己的小部件类:
from django.forms import RadioSelect
class HorizontalRadioSelect(RadioSelect):
template_name = 'admin/horizontal_radios.html'
option_template_name = 'admin/horizontal_inputs.html'
最后,在我的例子中,我指出它覆盖了我的管理员中的 formfield_overrides 类属性。但我认为你也可以在你的模型中做到这一点:
formfield_overrides = {
models.BooleanField: {'widget': HorizontalRadioSelect(choices=[(True, "Yes"), (False, "No"), (None, "Unknown")],)},
}