django 酥脆的形式与 jinja2

问题描述 投票:0回答:5

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

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 %}

如何一起使用这些应用程序?

django django-templates jinja2 django-crispy-forms
5个回答
12
投票

更好的解决方案:

模板标签.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) }}

4
投票

嗯,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. 的好主意。


2
投票

我找到了一种简单但尚未完成的“侵入”方法。

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

    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>

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


1
投票

我一直在努力解决你的这个问题,尽管给出的答案可能与几年前相关,但并没有让我满意。

所以我自己构建了一个hack,使脆皮表单可以与Django 3.0.2一起使用(我没有测试其他版本,如果任何其他版本有任何问题,请告诉我)。

安装相关软件包以使 Cripy Form 与 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) }}


0
投票

在最新版本中,Django 希望您将模板引擎选项直接添加到

settings.py
文件中。

在我们的例子中,我们会进行类似的处理。我还使用 django_jinja 包来帮助让集成这两种技术时变得更轻松。

TEMPLATES = [
    {
        "BACKEND": "django_jinja.jinja2.Jinja2",
        "DIRS": [
            BASE_DIR,
        ],
        "APP_DIRS": True,
        "OPTIONS": {
            "globals": {
                "crispy": "crispy_forms.utils.render_crispy_form",
            },
            "context_processors": [
                "django.contrib.auth.context_processors.auth",
                "django.template.context_processors.debug",
                "django.template.context_processors.i18n",
                "django.template.context_processors.media",
                "django.template.context_processors.static",
                "django.template.context_processors.tz",
                "django.contrib.messages.context_processors.messages",
            ],
            "match_extension": ".html",
            "app_dirname": "jinja2",
        },
    },
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
            ],
        },
    },
]
CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
CRISPY_TEMPLATE_PACK = "bootstrap5"
© www.soinside.com 2019 - 2024. All rights reserved.