如何将额外的上下文传递给django-crispy-forms字段模板?

时间:2014-04-22 15:10:51

标签: django-crispy-forms

检查django-crispyforms的bootstrap3模板包中的field.html模板,我注意到另外一个上下文变量" tag",引用。您可以在模板的line 12line 41上看到这一点。如何为"标记"指定值?在用于为特定表单字段呈现field.html模板的上下文中?

4 个答案:

答案 0 :(得分:3)

我使用palestamp的回复作为构建更通用的CustomCrispyField的指南。您可以将extra_context作为kwarg传递给CustomCrispyFieldextra_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 渲染,这成为非常有趣的概念如何将酥脆的形式转变为超级敏捷。我目前正在使用表单来呈现我的模板,而不是在模板中呈现表单 ^^