2016-08-27 3 views
0

У меня возникли проблемы с стилем моей формы django с ModelMultipleChoiceField.Styling ModelMultipleChoiceField Django

Heres моя форма:

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}} или что-то в моем цикле {% для skript в result_form.skripten%}, но это, к сожалению, невозможно ...

ответ

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.

Смежные вопросы