检查django-crispyforms的bootstrap3模板包中的field.html模板,我注意到另外一个上下文变量" tag",引用。您可以在模板的line 12和line 41上看到这一点。如何为"标记"指定值?在用于为特定表单字段呈现field.html模板的上下文中?
答案 0 :(得分:3)
我使用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>
答案 1 :(得分:1)
您可以像这样覆盖标准的脆弱字段:
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')
)
答案 2 :(得分:0)
tag
上下文变量在模板中设置,而不是在视图中设置。如果您使用的是内置的bootstrap3模板包,则会在包含field.html
的模板中定义。如果包含模板未定义tag
,则默认为div
。
例如:table_inline_formset.html
line 41。
答案 3 :(得分:0)
在 bobort 的回答之后,我想强调您可以使用任何查询集作为 extra_content 中的参数,这允许您通过自定义模板注入您想要的任何 html 渲染,这成为非常有趣的概念如何将酥脆的形式转变为超级敏捷。我目前正在使用表单来呈现我的模板,而不是在模板中呈现表单 ^^