如何水平渲染models.ManyToManyField复选框小部件?

时间:2013-07-15 09:01:04

标签: django django-models checkbox django-forms django-admin

我有一个型号名称App_type和SOA。

class SOA(models.Model):
      app_type        = models.ManyToManyField(App_type, verbose_name='Application Type')

在我的forms.py

class SoaForm(forms.ModelForm):
    app_type = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(), 
                                          queryset=App_type.objects.all(), label='Application Type')
    class Meta:
        model = SOA

字段表单在django admin中垂直渲染,占用太多空间。有没有办法以水平方式渲染字段?任何帮助或参考将不胜感激。

2 个答案:

答案 0 :(得分:0)

我使用Crispy字段完成了它。非常简单实用。 另外,您可以使用Bootstrap工具包。而你的生活将更容易。

http://django-crispy-forms.readthedocs.org/en/1.1.1/tags.html

答案 1 :(得分:0)

作为karthikr pointed out,片段在经过超级小调整后确实有效。

def render(self, name, value, attrs=None, choices=()):内的原始摘录:

   for column in columns:
        ...
        str_values = set([force_unicode(v) for v in value])
        for i, (option_value, option_label) in column:
            ...
            option_label = conditional_escape(force_unicode(option_label))
            output.append(u'<li><label%s>%s %s</label></li>' % (
                    label_for, rendered_cb, option_label))
        output.append(u'</ul>')
    return mark_safe(u'\n'.join(output))

修改为:

for column in columns:
        ...
        str_values = set([force_unicode(v) for v in value])

        output.append(u'<li>')                               ## added

        for i, (option_value, option_label) in column:            
            ...
            option_label = conditional_escape(force_unicode(option_label)) 

            ##<li> & </li> deleted
            output.append(u'<label%s>%s %s</label>' % (  
                    label_for, rendered_cb, option_label))
    ## added </li>
    output.append(u'</li></ul>')