[英]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.