django酥脆与jinja2形成

时间:2014-08-18 13:49:57

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

我想一起使用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 %}

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

4 个答案:

答案 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)

我发现了一种简单但未完成的“入侵”方式。

  1. 使用'django-jinja'软件包注册新的过滤器;
  2. 过滤器文件中的
  3. ,定义一个脆弱的过滤器,如下所示:

    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)
    
  4. 在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) }}