Skip to main content
 首页 » 编程设计

python之为什么 Django 会引发 "KeyError"

2025年05月04日21傻小

我目前正在尝试对我的 Django 网络应用程序实现分页。但是,当我尝试使用 library 中的模板标签时, Django 引发了一个关键错误。具体来说:

KeyError 
KeyError: 'request' 

这是我的设置.py:

from django.core.urlresolvers import reverse_lazy 
from os.path import dirname, join, exists 
import os 
 
# Build paths inside the project like this: join(BASE_DIR, "directory") 
BASE_DIR = dirname(dirname(dirname(__file__))) 
STATICFILES_DIRS = [join(BASE_DIR, 'static')] 
MEDIA_ROOT = join(BASE_DIR, 'media') 
MEDIA_URL = "/media/" 
 
# Use Django templates using the new Django 1.8 TEMPLATES settings 
TEMPLATES = [ 
    { 
        'BACKEND': 'django.template.backends.django.DjangoTemplates', 
        'DIRS': [ 
            join(BASE_DIR, 'templates'), 
            # insert more TEMPLATE_DIRS here 
        ], 
        'APP_DIRS': True, 
        'OPTIONS': { 
            'context_processors': [ 
                # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this 
                # list if you haven't customized them: 
                'django.contrib.auth.context_processors.auth', 
                'django.template.context_processors.debug', 
                'django.template.context_processors.i18n', 
                'django.template.context_processors.media', 
                'django.template.context_processors.static', 
                'django.template.context_processors.tz', 
                'django.contrib.messages.context_processors.messages', 
            ], 
        }, 
    }, 
] 
 
# Use 12factor inspired environment variables or from a file 
import environ 
env = environ.Env() 
 
# Ideally move env file should be outside the git repo 
# i.e. BASE_DIR.parent.parent 
env_file = join(dirname(__file__), 'local.env') 
if exists(env_file): 
    environ.Env.read_env(str(env_file)) 
 
# Quick-start development settings - unsuitable for production 
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/ 
 
ALLOWED_HOSTS = [] 
 
# Application definition 
 
INSTALLED_APPS = ( 
    'django.contrib.auth', 
    'django_admin_bootstrapped', 
    'django.contrib.admin', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
 
    'authtools', 
    'crispy_forms', 
    'easy_thumbnails', 
    'geoposition', 
    'bootstrap_pagination', 
 
    'profiles', 
    'accounts', 
    'clients', 
 
) 
 
MIDDLEWARE_CLASSES = ( 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 
 
ROOT_URLCONF = 'saas.urls' 
 
WSGI_APPLICATION = 'saas.wsgi.application' 
 
# Database 
# https://docs.djangoproject.com/en/dev/ref/settings/#databases 
 
DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.sqlite3', 
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 
 
# Internationalization 
# https://docs.djangoproject.com/en/dev/topics/i18n/ 
 
LANGUAGE_CODE = 'en-us' 
 
TIME_ZONE = 'UTC' 
 
USE_I18N = True 
 
USE_L10N = True 
 
USE_TZ = True 
 
# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/dev/howto/static-files/ 
 
STATIC_URL = '/static/' 
 
ALLOWED_HOSTS = [] 
 
# Crispy Form Theme - Bootstrap 3 
CRISPY_TEMPLATE_PACK = 'bootstrap3' 
 
# For Bootstrap 3, change error alert to 'danger' 
from django.contrib import messages 
MESSAGE_TAGS = { 
    messages.ERROR: 'danger' 
} 
 
# Authentication Settings 
AUTH_USER_MODEL = 'authtools.User' 
LOGIN_REDIRECT_URL = reverse_lazy("profiles:show_self") 
LOGIN_URL = reverse_lazy("accounts:login") 
 
THUMBNAIL_EXTENSION = 'png'     # Or any extn for your thumbnails 

我尝试运行的模板标签是:

{% block pagination %} 
    {% bootstrap_paginate page_obj range=10 show_prev_next="false" show_first_last="true" %} 
{% endblock %} 

要做什么?

请您参考如下方法:

bootstrap_paginate 模板标签 expects您的模板上下文包含 request 变量。通过将 context_processors 更改为:

使其可用
'context_processors': [ 
    # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this 
    # list if you haven't customized them: 
    'django.contrib.auth.context_processors.auth', 
    'django.template.context_processors.debug', 
    'django.template.context_processors.i18n', 
    'django.template.context_processors.media', 
    'django.template.context_processors.static', 
    'django.template.context_processors.tz', 
    'django.contrib.messages.context_processors.messages', 
    'django.contrib.auth.context_processors.request', # <-- Here we add the request 
],