在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

我想将单选按钮水平对齐。默认情况下,django表单以垂直格式显示

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
现在他们是:

PROJECT\u NAME/PROJECT\u APP/templates/admin/horizontal\u 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 %}
最后,在我的例子中,我指出它覆盖了我的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重写也应该是一样的,可以通过ModelAdmin
formfield\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>