簡體   English   中英

設置ModelMultipleChoiceField Django的樣式

[英]Styling ModelMultipleChoiceField 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放入表單文件中,這不是很mvc的方式。 這也嚴重限制了我如何設置列表的樣式(即制作模型實例字段的表)

無論如何,可以使它變得更聰明? 我想訪問{{skript.name}},{{skript.checkbox}}或我的{%for result_form.skripten%}循環中的skript的內容,但是遺憾的是這是不可能的...

您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM