Django选择多个小部件水平显示

3

我有一些选项组,类似于这样:

Choices = (('Group1',(('Option1','Option1'),('Option2','Option2'))))

有没有办法使用SelectMultiple小部件水平显示选项而不是垂直显示?我的问题是我有太多的组,所以如果我能有以下类似的东西就更好了:
Group 1 - Option1, Option2, ...
Group 2 - Option1, Option2, ...

更新 - 我找到了这个,但它只能“运行”于CheckboxSelectMultiple。我该如何更改才能使其与SelectMultiple一起工作?

from django.utils.safestring import mark_safe

class HorizWidget(forms.SelectMultiple):

    def render(self, *args, **kwargs):
        output = super(HorizWidget, self).render(*args,**kwargs) 
        return mark_safe(output.replace(u'<ul>', u'').replace(u'</ul>', u'').replace(u'<li>', u'<p>').replace(u'</li>', u'</p>'))
2个回答

2

您是否正在使用Django管理界面?如果是的话,filter_horizontalfilter_vertical选项可以使多选更加易用(我必须承认,我以前没有尝试过使用分组选择)。

如果这些选项无法帮助您,那么您可以子类化SelectMultiple小部件并按照您的意愿覆盖render方法。我个人更喜欢在可能的情况下使用javascript小部件插件(例如jquery-ui-multiselect)。它们通常只需要在模板头中添加几行javascript代码即可工作,这比编写自定义小部件html要容易得多。


是的,我正在使用Django Admin。我想我会尝试覆盖SelectMultiple小部件。我对Django还很陌生... - Pedro
找到了这个代码,但它只适用于CheckboxSelectMultiple。我应该如何更改它以使其与SelectMultiple一起使用?class HorizWidget(forms.SelectMultiple): def render(self, *args, **kwargs): output = super(HorizWidget, self).render(*args,**kwargs) return mark_safe(output.replace(u'
    ', u'').replace(u'
', u'').replace(u'
  • ', u'

    ').replace(u'

  • ', u'

    '))
    - Pedro
    1
    请不要在评论区发布大代码块——您会失去所有缩进,从而非常难以阅读。您可以编辑原始问题,在那里包含代码。很抱歉,我无法帮助您编写自定义小部件,但我希望有人能帮助您或者您可以解决问题。祝您好运! - Alasdair

    0

    虽然来晚了,但可能仍对某些人有帮助:

    Form(forms.Form):
        selection = forms.ModelMultipleChoiceField(queryset=models.MyModel.objects.all(),
                                                   widget=widgets.FilteredSelectMultiple('', False))
    

    需要一个 from django.contrib.admin import widgets,因为这是一个仅限于管理员使用的小部件。 - Tim Tisdall
    请查看以下链接:https://stackoverflow.com/questions/45858181/djangos-filteredselectmultiple-widget-only-works-when-logged-in/65831944#65831944 - openHBP

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接