Как можно передать дополнительный контекст в шаблоны полей django-crispy-forms?

Изучая шаблон field.html в пакете шаблонов bootstrap3 django-crispyforms, я заметил дополнительную переменную контекста, «тег», на которую ссылается. Вы можете увидеть это в строке 12. и строка 41. шаблона. Как я могу указать значение для «тега» в контексте, используемом для отображения шаблона field.html для определенного поля формы?


person acspike    schedule 22.04.2014    source источник


Ответы (4)


Контекстная переменная tag задается в шаблоне, а не в представлении. Если вы используете встроенный пакет шаблонов bootstrap3, он определен в шаблоне, который включает field.html. Если включающий шаблон не определяет tag, то по умолчанию используется div.

Пример: table_inline_formset.html строка 41.

person Dave    schedule 09.07.2014

Я использовал ответ palestamp в качестве руководства для создания более общего CustomCrispyField. Вы можете передать extra_context как kwarg в CustomCrispyField. extra_context — это просто словарь, к которому я обращаюсь в своем пользовательском шаблоне, скопированном из crispy_forms.

from crispy_forms.layout import Field
from crispy_forms.utils import TEMPLATE_PACK


class CustomCrispyField(Field):
    extra_context = {}

    def __init__(self, *args, **kwargs):
        self.extra_context = kwargs.pop('extra_context', self.extra_context)
        super(CustomCrispyField, self).__init__(*args, **kwargs)

    def render(self, form, form_style, context, template_pack=TEMPLATE_PACK, extra_context=None, **kwargs):
        if self.extra_context:
            extra_context = extra_context.update(self.extra_context) if extra_context else self.extra_context
        return super(CustomCrispyField, self).render(form, form_style, context, template_pack, extra_context, **kwargs)

И я бы использовал это так в моей форме:

self.helper.layout=Div(CustomCrispyField('my_model_field', css_class="col-xs-3", template='general/custom.html', extra_context={'css_class_extra': 'value1', 'caption': 'value2'})

И мой шаблон будет иметь код, подобный следующему:

{% crispy_field field %}
<button class="btn {{ css_class_extra }}">{{ caption }}</button>
person Bobort    schedule 16.12.2016

Вы можете просто переопределить стандартное хрустящее поле следующим образом:

class LinkField(Field):
    def __init__(self, *args, **kwargs):
        self.view_name = kwargs.pop('view_name')
        super(LinkField, self).__init__(*args, **kwargs)

    def render(self, form, form_style, context, template_pack=CRISPY_TEMPLATE_PACK):
        if hasattr(self, 'wrapper_class'):
            context['wrapper_class'] = self.wrapper_class

        if hasattr(self, 'view_name'):
            context['view_name'] = self.view_name
        html = ''

        for field in self.fields:
            html += render_field(field, form, form_style, context, template=self.template, attrs=self.attrs, template_pack=template_pack)
        return html

Затем просто передайте дополнительную переменную ('view_name') в переопределенном шаблоне.

В макете это будет выглядеть так:

Layout(
    LinkField('field_name', template='path_to_overridden_template',
                      view_name='variable_to_pass')
)
person palestamp    schedule 10.07.2015

после ответа bobort я хотел бы подчеркнуть, что для этого вы можете использовать любой набор запросов в качестве аргументов в extra_content, что позволяет вам через настраиваемый шаблон вводить html-рендеринг всего, что вы хотите, это становится очень интересной концепцией о том, как преобразовать хрустящий превращается в сверхпроворного. В настоящее время я использую формы для рендеринга своих шаблонов вместо рендеринга форм в шаблонах ^^

person Drayen Dörff    schedule 23.06.2021