我想同时使用 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 %}
如何一起使用这些应用程序?
更好的解决方案:
模板标签.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) }}
嗯,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. 的好主意。
我找到了一种简单但尚未完成的“侵入”方法。
在过滤器文件中,定义一个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>
如果有人找到更有效的脆皮表格方法,请告诉我。
我一直在努力解决你的这个问题,尽管给出的答案可能与几年前相关,但并没有让我满意。
所以我自己构建了一个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) }}
在最新版本中,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"