Изучая шаблон field.html в пакете шаблонов bootstrap3 django-crispyforms, я заметил дополнительную переменную контекста, «тег», на которую ссылается. Вы можете увидеть это в строке 12. и строка 41. шаблона. Как я могу указать значение для «тега» в контексте, используемом для отображения шаблона field.html для определенного поля формы?
Как можно передать дополнительный контекст в шаблоны полей django-crispy-forms?
Ответы (4)
Контекстная переменная tag
задается в шаблоне, а не в представлении. Если вы используете встроенный пакет шаблонов bootstrap3, он определен в шаблоне, который включает field.html
. Если включающий шаблон не определяет tag
, то по умолчанию используется div
.
Пример: table_inline_formset.html
строка 41 а>.
Я использовал ответ 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>
Вы можете просто переопределить стандартное хрустящее поле следующим образом:
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')
)
после ответа bobort я хотел бы подчеркнуть, что для этого вы можете использовать любой набор запросов в качестве аргументов в extra_content, что позволяет вам через настраиваемый шаблон вводить html-рендеринг всего, что вы хотите, это становится очень интересной концепцией о том, как преобразовать хрустящий превращается в сверхпроворного. В настоящее время я использую формы для рендеринга своих шаблонов вместо рендеринга форм в шаблонах ^^