2016-04-28 64 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()