样式ModelMultipleChoiceField Django

时间:2016-08-27 21:48:41

标签: python html django

我无法使用ModelMultipleChoiceField为我的django表单设置样式。

继承我的形式:

class SkriptenSelect(forms.Form):
skripten = StyledModelMultipleChoiceField(
    queryset=None,
    widget=forms.CheckboxSelectMultiple,
)

def __init__(self, *args, **kwargs):
    choices = kwargs.pop('choices')
    super(SkriptenSelect, self).__init__(*args, **kwargs)
    self.fields['skripten'].queryset = choices

class StyledModelMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
    return mark_safe('<ul class="list-inline" style="display: inline;">' \
                     '<li>{name}</li>' \
                     '<li>{semester}</li>' \
                     '<li>professor</li>' \
                     '</ul>'.format(name=escape(obj.name), semester=escape(obj.prefix))
                     )

我用这个用于html:

<form action="." method="post">
  <ul class="list-group">
    {% for skript in result_form.skripten %}
        <li class="list-group-item">
            {{ skript }}
        </li>
    {% endfor %}
</ul>
{% csrf_token %}
<input type="submit" value="Submit Selected" />

这要求我将我的HTML放在我的表单文件中,这不是一种非常简单的方式。它也严重限制了我如何设置列表样式(即制作模型实例字段表)

有没有让这更聪明?我想访问{{skript.name}},{{skript.checkbox}}或我的{%for skript in result_form.skripten%}循环中的内容,但遗憾的是这不可能......

1 个答案:

答案 0 :(得分:0)

您可以使用render_to_string。它加载模板并使用上下文呈现它。返回一个字符串。

from django.template.loader import render_to_string
rendered = render_to_string('my_template.html', {'foo': 'bar'})

对于各种变体,您可以创建各种StyledModelMultipleChoiceField子类,或在初始化类时传递所需的template_name。例如:

>>> class FooField:
...     def __init__(self, template_name='default.html'):
...         self.template_name = template_name
...
>>> x = FooField('table.html')
>>> x.template_name
'table.html'

在适当情况下使用self.template_name

def label_from_instance(self, obj)
    return render_to_string(self.template_name, {'foo': obj.foo})

如果要显示多个实例,请使用formset