使用 jinja2 模板引擎渲染 django 表单

Posted

技术标签:

【中文标题】使用 jinja2 模板引擎渲染 django 表单【英文标题】:Rendering django forms with jinja2 template engine 【发布时间】:2016-08-23 14:12:13 【问题描述】:

我在 django 项目中使用 jinja2 模板引擎。我对设置做了相应的更改:

TEMPLATES = [
    
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(PROJECT_DIR.child("templates"), ''),],
        'OPTIONS': 
            'environment': 'web_services.settings.jinja2.environment',
        
    ,
]

从这里加载环境:

from django.contrib.staticfiles.storage import staticfiles_storage
from django.core.urlresolvers import reverse

from jinja2 import Environment


def environment(**options):
    env = Environment(**options)
    env.globals.update(
        'static': staticfiles_storage.url,
        'url': reverse,
    )
    return env

我现在在模板中渲染 django 表单时遇到问题。我有以下登录表单:

class LoginForm(forms.Form):
    email = forms.EmailField(
        widget=forms.TextInput(
            attrs='class':'form-control', 'placeholder':'email', 
                   'required':'True', 'max_length':'80'
        ), label='Email address'
    )
    password = forms.CharField(
        widget=forms.PasswordInput(
            attrs='class':'form-control', 'placeholder':'password', 
                   'required':'True', 'max_length':'80', 'render_value':'False'
        ), label="Password"
    )

在模板中我像这样使用这个 django 表单

<form method="post" name=" url('auth:login') ">
   <div class="form-1-field">
       LoginForm.email 
       LoginForm.password 
   </div>
</form>

在我渲染的模板中,我收到以下错误 no such element: django.forms.forms.DeclarativeFieldsMetaclass object['email']

为什么会这样,我该如何解决这个问题?

编辑

把错误的观点。这是我无法使用的:

class IndexAccounts(View):

    def get(self, request):
        if request.user.is_authenticated():
            return redirect(reverse('home:index'))
        return render(request, 'login.jinja2', 'LoginForm': LoginForm)

【问题讨论】:

您能提供视图吗?还有你打电话给environment()的地方? @vmonteco 提供了上面的视图。我是否需要明确调用environment()?正如我从docs 了解到的那样,我只需要将参考放入TEMPLATES 设置中的选项 我的错,看来你是对的。那你能提供一个完整的回溯吗? @vmonteco 我认为没有追溯。它只是渲染这个 no such element: django.forms.forms.DeclarativeFieldsMetaclass object['email'] 并在页面上显示它?我的意思是没有像人们期望的那样标准的黄页追溯 你知道涉及到哪一行吗?真正的问题(我真的不知道),你确定你的 post() 函数只处理 POST 请求吗? 【参考方案1】:

我假设您的LoginFormModelForm

尝试实例化它,你直接传递了类本身而不是实例:

class IndexAccounts(View):

    def get(self, request):
        if request.user.is_authenticated():
            return redirect(reverse('home:index'))
        return render(request, 'login.jinja2',
                      'LoginForm': LoginForm()) # <- just add the ()

【讨论】:

以上是关于使用 jinja2 模板引擎渲染 django 表单的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 1.8 中使用 jinja2 作为模板引擎

使用 jinja2 作为 django 模板引擎时出错:无法导入名称“环境”

在 Jinja2 模板引擎中使用 django-widget-tweaks

Jinja2模板引擎简介

Flask 学习-4.templates 渲染模板

模板渲染