在django窗体中水平对齐单选按钮
嗨 我想将单选按钮水平对齐。默认情况下,django表单以垂直格式显示在django窗体中水平对齐单选按钮,django,forms,radio-button,alignment,Django,Forms,Radio Button,Alignment,嗨 我想将单选按钮水平对齐。默认情况下,django表单以垂直格式显示 feature_type = forms.TypedChoiceField(choices = formfields.FeatureType, widget = forms.RadioSelect) 是否有任何特殊的参数,我们可以通过单选按钮对齐 提前感谢这是无线电场的行为。如果希望水平渲染,请创建水平渲染器,如下所示: from django.utils.safestring import mark_safe cla
feature_type = forms.TypedChoiceField(choices = formfields.FeatureType, widget = forms.RadioSelect)
是否有任何特殊的参数,我们可以通过单选按钮对齐
提前感谢这是
无线电场的行为
。如果希望水平渲染,请创建水平渲染器,如下所示:
from django.utils.safestring import mark_safe
class HorizontalRadioRenderer(forms.RadioSelect.renderer):
def render(self):
return mark_safe(u'\n'.join([u'%s\n' % w for w in self]))
class ApprovalForm(forms.Form):
approval = forms.ChoiceField(choices=APPROVAL_CHOICES,
initial=0,
widget=forms.RadioSelect(renderer=HorizontalRadioRenderer),
)
修改的表单。RadioSelect:
class HorizontalRadioSelect(forms.RadioSelect):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
css_style = 'style="display: inline-block; margin-right: 10px;"'
self.renderer.inner_html = '<li ' + css_style + '>{choice_value}{sub_widgets}</li>'
class HorizontalRadioSelect(forms.RadioSelect):
定义初始化(self,*args,**kwargs):
super()
css_style='style=“显示:内联块;右边距:10px;”
self.renderer.inner_html='{choice_value}{sub_widgets} '
在Python3.4上使用Django 1.10的标准管理员
和Django-Suit()
尚未针对Django grappelli进行测试。根据“attrs”,是一个包含要在呈现的小部件上设置的HTML属性的字典
考虑到这一点,基于表单的简单解决方案如下所示:
feature_type = forms.TypedChoiceField(
choices = formfields.FeatureType,
widget = forms.RadioSelect(attrs={
'style': 'display: inline-block'
})
)
另一种方法是将ul->li列表的样式更改为display:inline block。你可以这样做
<style>
ul#youelementId li{
display: inline-block;
}
</style>
ul#youelementId li{
显示:内联块;
}
希望这能帮助下一位读者 在我的Django 2.2.6上,上面的解决方案没有很好地工作,所以我在多次尝试后发布了我的解决方案,并遵循面包屑,直到使用Django表单小部件模板 我必须重写2个模板,继承我自己的widget类,然后指向它 已修改的默认django模板包括:
- django/forms/templates/django/forms/widgets/input_option.html
- django/forms/templates/django/forms/widgets/multiple_input.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 %}
最后,在我的例子中,我指出它覆盖了我的admin中的formfield\u覆盖了class属性。但你也可以在你的模型中做到这一点我认为:
formfield_overrides = {
models.BooleanField: {'widget': HorizontalRadioSelect(choices=[(True, "Yes"), (False, "No"), (None, "Unknown")],)},
}
我想出了另一个解决办法。如果使用引导程序呈现表单,可以将.form check内联类添加到输入中,该字段将水平显示。下面列出的代码显示了我所描述的内容。我希望这有助于人们重新发明轮子。谢谢你的阅读。保重,祝你度过愉快的一天
feature_type = forms.MultipleChoiceField(
required=False,
...
widget=forms.CheckboxSelectMultiple(attrs={'class': 'form-check-inline'})
)
实际上不需要覆盖管理中的小部件、模板或任何其他内容。至少从2008年开始(请参阅),最简单的方法是传递class属性inline
:attrs={'class':'inline'}
在自定义表单中,它可能看起来像:
field=forms.ChoiceField(选项=(('1','1'),('2','2')),
widget=forms.RadioSelect(attrs={'class':'inline'}))
…对于复选框,它的工作原理是一样的:
field=forms.MultipleChoiceField(选项=(('1','1'),('2','2')),
widget=forms.CheckboxSelectMultiple(attrs={'class':'inline'}))
formfield重写也应该是一样的,可以通过ModelAdminformfield\u重写
或*
函数的formfield\u进行重写。因为renerer为我提出了这个错误:
AttributeError:类型对象“RadioSelect”没有属性“renderer”
我想出了这个代码:
<form method="post">
{% csrf_token %}
{% for question in form %}
<p>{{ question.label }}: </p>
{% for choice in question %}
{{ choice }}
{% endfor %}
{% endfor %}
<br><br>
<button type="submit">
submit
</button>
</form>
{%csrf_令牌%}
{%形式的问题为%}
{{question.label}}:
{%用于问题%中的选择}
{{choice}}
{%endfor%}
{%endfor%}
提交
我认为这比Django更像是一个CSS问题。您可以向单选按钮添加一个类,并说float:left;在你的css单选按钮类。我已经谷歌了它,我发现了一个链接,我无法使其工作。我将尝试添加css,并会让你知道它是否修复。感谢geekamHey lakshman,当我执行上述代码时,它的获取错误mark_safe
没有定义。如果你能帮上忙,这将是一个巨大的帮助,你应该从Django.templatesCool导入它的工作良好的laxman。感谢您的帮助:-)为了让mark_safe正常工作,我从django.utils.safestring导入了:自django 1.11以来,这在forms.RadioSelect.renderer中给了我一个错误:“type object‘RadioSelect’没有属性‘renderer’。我遇到了相同的错误“type object‘RadioSelect’没有属性‘renderer’”。请提供任何帮助。没有“显示”属性,这应该是“样式”:“显示:内联块”
,它不会以这种方式工作<代码>显示:内联块将应用于单选按钮,而不是
。此答案不直接适用于用户提供的示例代码,因此不会回答他们的问题。这是Django 2.0+版本的正确解决方案,谢谢!这是一个非常好且干净的解决方案。这是在Django3.1.4中对我有效的唯一方法
feature_type = forms.MultipleChoiceField(
required=False,
...
widget=forms.CheckboxSelectMultiple(attrs={'class': 'form-check-inline'})
)
<form method="post">
{% csrf_token %}
{% for question in form %}
<p>{{ question.label }}: </p>
{% for choice in question %}
{{ choice }}
{% endfor %}
{% endfor %}
<br><br>
<button type="submit">
submit
</button>
</form>