2016-04-28 147 views
0

我在django项目中使用jinja2模板引擎。我做了相应的改变设置:用jinja2模板引擎渲染django表格

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表单的问题。我有以下LoginForm的:

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}) 
+0

你能提供的观点吗?和你调用'environment()'的地方? – vmonteco

+0

@vmonteco提供上面的视图。我是否需要显式调用'environment()'?正如我从[文档](https://docs.djangoproject.com/es/1.9/topics/templates/#django.template.backends.jinja2.Jinja2)中理解的,我只需要在“TEMPLATES”中引用选项设置 – AmirM

+0

我的不好,看来你是对的。你能提供一个完整的回溯? – vmonteco

回答

2

我假定你LoginForm是一个ModelForm

尝试实例吧,你直接传递类本身,而不是一个实例:

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()