KeyError at - request - django templatetag - PullRequest
3 голосов
/ 10 апреля 2019

Вот мой код в теге шаблона

@register.simple_tag(takes_context=True, name=CAR_TEMPLATE_TAG_NAME)
def g_c(context,session_key=None,c_class=Car):
    request = context['request']  
    return c_class(request, session_key=session_key)

В шаблоне он используется как {% g_c as car %}, и проблема заключается в ключевом ошибке 'request' в request = context['request']

Вот мойконтекст шаблона,

'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
               # 'django.core .context_processors.request,
                'django.contrib.auth.context_processors.auth',
                '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',
            ],

Вот попытка,

enter image description here

Вот новая строка, добавленная в templatetag

from django.conf import TEMPLATE_CONTEXT_PROCESSORS

В настройках добавлено

TEMPLATE_CONTEXT_PROCESSORS = 'django.template.context_processors.request'

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Настройки по умолчанию включают процессор контекста шаблона запроса, который добавляет запрос, который будет использоваться в шаблоне.

https://docs.djangoproject.com/en/2.2/topics/templates/#configuration https://docs.djangoproject.com/en/2.2/howto/custom-template-tags/#simple-tags

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.template.context_processors.tz',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Для доступа к контексту

DEFAULT_C_CLASS = Car

@register.simple_tag(name=CAR_TEMPLATE_TAG_NAME, takes_context=True)
def g_c(context, session_key=None, c_class=None):
    request = context['request']
    c_class = c_class or DEFAULT_C_CLASS
    session_key = session_key or request.session.session_key

    # Note this class __init__ should return a fragment.
    return c_class(request, session_key=session_key)

base.html

{% load my_custom_tag %} 

{% g_c as car %}

Вытакже может передать объект запроса непосредственно в шаблон

@register.simple_tag(name='g_c')
def g_c(request, session_key=None, c_class=None):
    c_class = c_class or DEFAULT_C_CLASS
    session_key = session_key or request.session.session_key

    # Note this class __init__ should return a fragment.
    return c_class(request, session_key=session_key)

base.html

 {% load my_custom_tag %} 

 {% g_c request as car %}
0 голосов
/ 30 апреля 2019

Сначала необходимо импортировать настройки:

from django.conf.settings import TEMPLATE_CONTEXT_PROCESSORS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...