【问题标题】:django crispy forms with jinja2带有 jinja2 的 django 酥脆形式
【发布时间】:2014-10-11 11:10:06
【问题描述】:

我想同时使用 Jinja2 和 Django 脆皮表单,但是当我在模板中加载脆皮表单标签并尝试使用此模板标签呈现表单时,出现错误:

Encountered unknown tag 'crispy'. Jinja was looking for the following tags: 'endblock'. The innermost block that needs to be closed is 'block'.

我的模板代码:

{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="panel-heading"><h3>Registration</h3></div>
    {% crispy form %}
{% endblock %}

如何同时使用这些应用程序?

【问题讨论】:

  • 我猜你不能,除非你为脆的表格写 Jinja2 模板标签。 Django 模板标签在 Jinja2 模板中不起作用。

标签: django django-templates jinja2 django-crispy-forms


【解决方案1】:

更好的解决方案:

模板标签.py

from crispy_forms.utils import render_crispy_form
from django_jinja import library
from jinja2 import contextfunction


@contextfunction
@library.global_function
def crispy(context, form):
    return render_crispy_form(form, context=context)

在模板中:

{{ crispy(form) }}

【讨论】:

    【解决方案2】:

    我找到了一种简单但不完整的“入侵”方法。

    1. 使用“django-jinja”包注册新过滤器;
    2. 在过滤器文件中,定义一个清晰的过滤器,如下所示:

      from crispy_forms.templatetags.crispy_forms_filters import as_crispy_form
      def crispy(form):
          return as_crispy_form(form, 'Bootstrap3', form.helper.label_class, form.helper.field_class)
      

    在表单Jinja模板中,我要写比django模板中直接crispy标签更多的代码:

    <form id='id_form' class="form-horizontal" method='post'>
        {% csrf_token %}
        {{form.media}}
        {{ form|crispy() }}
        <div>
            <input type="submit" name="submit" value="Submit" class="btn btn-primary" id="submit-id-submit">
        </div>
    </form>
    

    如果有人找到更有效的方法来制作酥脆的表格,请告诉我。

    【讨论】:

      【解决方案3】:

      好吧,Geoffrey R. 的回答是一个很好的方法,但是使用了错误的 jinja2 方法。而不是render_crispy_form,它应该是as_crispy_form。所以,from crispy_forms.templatetags.crispy_forms_filters import as_crispy_form应该写在开头。

      修正后的例子jinja2.py文件如下。

      from crispy_forms.templatetags.crispy_forms_filters import as_crispy_form # this line is different
      
      from django.contrib import messages
      from django.contrib.staticfiles.storage import staticfiles_storage
      from django.urls import reverse
      from django.utils import translation
      from jinja2 import Environment
      
      
      def environment(**options):
          env = Environment(
              extensions=["jinja2.ext.i18n", "jinja2.ext.with_"], **options
          )
          env.globals.update(
              {
                  "get_messages": messages.get_messages,
                  "static": staticfiles_storage.url,
                  "crispy": as_crispy_form,  # this line is different
                  "url": reverse,
              }
          )
          env.install_gettext_translations(translation)
          return env
      

      其他步骤与 Geoffrey R. 的回答相同。


      它适用于我,带有以下 pip 包:

      Django==3.1.2
      django-crispy-forms==1.9.2
      Jinja2==2.11.2
      

      顺便说一句,我没有使用django-jinja pip 包。

      感谢 Geoffrey R. 的好主意。

      【讨论】:

        【解决方案4】:

        我一直在为你的这个问题而苦苦挣扎,给出的答案虽然几年前可能相关,但并没有让我满意。

        所以我自己构建了一个 hack 以使清晰的表单与 Django 3.0.2 一起工作(我没有测试其他版本,如果有请告诉我是任何其他版本的任何问题)。

        安装相关的包,让清晰的表单与 Jinja2 一起工作:

        pip install django-crispy-forms django-jinja
        

        在您的项目目录(并且不是您的应用程序目录)中,确保您有一个jinja2.py 文件,其中包含:

        from crispy_forms.utils import render_crispy_form
        
        from django.contrib import messages
        from django.contrib.staticfiles.storage import staticfiles_storage
        from django.urls import reverse
        from django.utils import translation
        from jinja2 import Environment
        
        
        def environment(**options):
            env = Environment(
                extensions=["jinja2.ext.i18n", "jinja2.ext.with_"], **options
            )
            env.globals.update(
                {
                    "get_messages": messages.get_messages,
                    "static": staticfiles_storage.url,
                    "crispy": render_crispy_form,  # THIS LINE IS RELEVANT
                    "url": reverse,
                }
            )
            env.install_gettext_translations(translation)
            return env
        

        确保您的 jinja2 模板引擎在您的 django 的 settings 中加载此选项:

        TEMPLATES = [
            {
                "BACKEND": "django.template.backends.jinja2.Jinja2",
                "DIRS": [os.path.join(BASE_DIR, "jinja2")],
                "APP_DIRS": True,
                "OPTIONS": {"environment": "your_django_project.jinja2.environment"},
            },
            # ...
        

        注意"crispy": render_crispy_form,,它将帮助您在 jinja2 模板中使用清晰的表单。

        然后,在您的模板中,您可以使用:

        {{ crispy(form) }}

        【讨论】:

          猜你喜欢
          • 2019-03-17
          • 2012-12-06
          • 2019-04-26
          • 2013-04-23
          • 2016-01-29
          • 2014-12-28
          • 2018-01-16
          • 2015-02-18
          • 2016-01-26
          相关资源
          最近更新 更多