我想一起使用Jinja2和Django crispy表单,但是当我在模板中加载crispy_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 %}
我如何一起使用这些应用程序?
答案 0 :(得分:10)
更好的解决方案:
templatetags.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) }}
答案 1 :(得分: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>
如果有人找到更有效的方式来制作香脆的表格,请告诉我。
答案 2 :(得分:1)
好吧,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.的好主意。
答案 3 :(得分:0)
我一直在为这个问题而苦苦挣扎,尽管几年前它们可能很有意义,但给出的答案使我不满意。
因此,我自己构建了一个 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) }}