视图调用的扩展模板中的Django上下文错误

时间:2017-09-25 13:59:28

标签: python django templates django-views

我使用Django-Jet模板在Django 1.11中工作。

现在我需要扩展模板以显示从视图中恢复的一些数据。所以,我定义了我的模板和我的观点。 这是代码:

views.py

from django.shortcuts import render
from django.shortcuts import render_to_response 
from django.views.generic import View  
from django.template.context import RequestContext
from django.template import Context, Template 

class MyView(View):
    def get(self, request, *args, **kwargs):
        op = str(self.kwargs['op']).strip().lower()
        pk = self.kwargs['pk']

        if op =='get':
            template='frontend/templates/show_my_data.html'
            return render_to_response(template,{'foo':'bar'})

        else:
            return HttpResponse("Not found")

我的简单模板:

{% extends "admin/base.html" %}
{% load i18n admin_urls static admin_modify %}
{% block content %}
{{ foo }}
{% endblock %}

settings.py

TEMPLATES = [
{
     'BACKEND': 'django.template.backends.django.DjangoTemplates',
     'DIRS': [os.path.join(BASE_DIR,'static/')],
     'APP_DIRS': True,
     'OPTIONS': {
          'context_processors': [
              'django.template.context_processors.debug',
              'django.template.context_processors.request',
              'django.contrib.auth.context_processors.auth',
              'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

....

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

但是当我进行测试时,我得到一个关键错误:

Request Method:     GET
Request URL:    http://127.0.0.1:8000/admin/data_from_db/get/24/
Django Version:     1.11.2
Exception Type:     KeyError
Exception Value:    

'user'

Exception Location:     /home/marco/sviluppo/myapp/myvenv/lib/python3.4/site-packages/django/template/context.py in __getitem__, line 87
Python Executable:  /home/marco/sviluppo/myapp/myvenv/bin/python 

所以,我做了一些测试,我发现问题是(可能)在上下文变量中。这是我需要扩展的基本模板:

base.html文件

.....
{% if user.is_active and user.is_staff %}
     {% jet_get_menu as app_list %}
            {% if SIDE_MENU_COMPACT %}
                 {% for app in app_list %}
                   #print menu
                 {% endfor%}
.........

如果我删除第一个条件:{%if user.is_active和user.is_staff%},{%jet_get_menu中的KeyError将为app_list%}。 我会告诉你一些屏幕。

普通管理模板:

https://imgur.com/TKmc1mH

如果我不从base.html模板中删除{%if user.is_active和user.is_staff%},则查看结果

https://imgur.com/BYtnEqM

你可以看到页面完全是空的:没有菜单标签,右上角没有登录框,ecc。

似乎没有像用户这样的上下文变量,但我不明白为什么。

2 个答案:

答案 0 :(得分:0)

您需要在每个模板中加载jet_tags,您将使用它们:

{% load jet_tags %}

答案 1 :(得分:0)

您需要使用render快捷方式而不是render_to_response,以便运行上下文处理器。

if op == 'get':
    template = 'frontend/templates/show_my_data.html'
    return render(request, template, {'foo':'bar'})