【问题标题】:KeyError exception type Django template tagKeyError 异常类型 Django 模板标签
【发布时间】:2026-01-23 06:00:01
【问题描述】:

我正在尝试在我的 django 项目中实现一个模板标签,但我遇到了一个关键错误。我相信这与在 load_menu.py 下的模板标签中获取上下文有关。

Exception Type: KeyError
Exception Value:'request'
Error during template rendering

In template C:\Users\Eric Franzen\PycharmProjects\MySite\templates\app\TikSys\tiksys_home.html, error at line 0

request
1   {% extends 'app/TikSys/tiksysbase.html' %}
2   {% block content %}
3   <div class="body-container">
4   {% include "app/TikSys/sidenavbar.html" %}
5   <div class="col-md-10 ">
6    <div class="jumbotron">
7        <h1>Welcome to TikSys!</h1>
8        <p>Please Sign In</p>
9        </div>
10  </div>

追溯

...
File "C:\Users\Eric Franzen\PycharmProjects\MySite\Site\views.py", line 43, in tiksys_home
        return render(request, 'app/TikSys/tiksys_home.html', {})
...
File "C:\Users\Eric Franzen\PycharmProjects\MySite\Site\templatetags\load_menu.py", line 10, in menu
    request = context['request']

网站/模板标签/load_menu.py

from django import template
from Site.models import *

register = template.Library()


@register.inclusion_tag('app/TikSys/sidenavbar.html', takes_context=True)
def menu(context):
    request = context['request']
    um = UserMunicipal.objects.filter(userID=request.user).values('municipalID')
    m = Municipal.objects.filter(id=um)
    return {'menus': m}

app/TikSys/sidenavbar.html

<div class="col-md-2 NavBar">
    {% load load_menu %}
    {% menu %}
    {% for item in menus %}
        <ul class="nav nav-pills nav-stacked">
            <li>{{ item.name }} </li>
    </ul>
    {% endfor %}
</div>

views.py

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse
from django.template import Context, loader
from django.views.generic import TemplateView
from Site.forms import UserForm, UserProfileForm
from django.http import *
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth import get_user_model
from .models import Notification, UserMunicipal, Municipal

@login_required(login_url='/login/')
def tiksys_home(request):
    return render(request, 'app/TikSys/tiksys_home.html', {})

【问题讨论】:

  • 正如错误所示:您的上下文中没有request。您可能需要将 django.template.context_processors.request 添加到您的上下文处理器设置中。
  • @solarissmoke 我的 setting.py 已经包含了这个,'OPTIONS': [ 'context_processors': [ 'django.template.context_processors.request',
  • @solarissmoke 我刚刚添加了它

标签: python django


【解决方案1】:

您正在加载标签,在呈现标签的同一模板中。这就是不再有上下文的原因。

标签呈现app/TikSys/sidenavbar.html的模板,应该只有这个:

<div class="col-md-2 NavBar">
    {% for item in menus %}
        <ul class="nav nav-pills nav-stacked">
            <li>{{ item.name }} </li>
    </ul>
    {% endfor %}
</div>

在主模板(需要菜单的地方)中,在顶部添加 - {% load load_menu %},然后在需要菜单的地方添加 {% menu %},如下所示:

{% load load_menu %}
{% extends 'app/TikSys/tiksysbase.html' %}
{% block content %}
<div class="body-container">
  {% menu %}
  <div class="col-md-10 ">
     <div class="jumbotron">
        <h1>Welcome to TikSys!</h1>
        <p>Please Sign In</p>
     </div>
  </div>

【讨论】: