【问题标题】:using django session inside templates在模板中使用 django 会话
【发布时间】:2012-08-19 06:04:12
【问题描述】:
# views.py
def like(request,option="food",restaurant = 1):
    if request.is_ajax:
        like = '%s_like' % str(option)
        if 'restaurants' in request.session:
            if restaurant not in request.session['restaurants']:
                request.session['restaurants'][restaurant] = {}
            x = request.session['restaurants'][restaurant].get(str(like),False)
            if x:
                return HttpResponse(False)
            else:
                request.session['restaurants'][restaurant][str(like)] = True
                request.session.modified = True

        else:
            request.session['restaurants'] = {}
        request.session.modified = True

我正在使用context_instance = RequestContext(request),以便会话变量可用,同时呈现响应。我的模板:

{% if request.session.restaurants.rest.id.food_like %}
working
{% else %}
    failed
{% endif %}

我的视图会话密钥如下所示:

request.session["restaurants"][restaurant][like] = True

restaurant 是餐厅 ID,like 可以是“food_like”、“service_like”、“special_like”之一。

那么我应该如何在我的模板中访问它?例如,如果我使用

request.session.restaurants.rest.id.food_like 

它肯定不会起作用。

【问题讨论】:

  • RequestMiddleware 在你的 MIDDLEWARE_CLASSES 中吗?
  • 不,我的中间件类是:MIDDLEWARE_CLASSES = ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware' , 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', )

标签: python django django-templates django-sessions


【解决方案1】:

您的settings.TEMPLATE_CONTEXT_PROCESSORS 中可能没有django.core.context_processors.request

您可以尝试在模板中打印{{ request }},如果没有显示,则说明您没有。

您也可以使用 ./manage.py shell 进行检查:

from django.conf import settings
print settings.TEMPLATE_CONTEXT_PROCESSORS

如果django.core.context_processors.request 不存在,则将TEMPLATE_CONTEXT_PROCESSORS从shell 输出复制到您的settings.py,并将django.core.context_processors.request 添加到此列表中。

【讨论】:

  • 是的,它不存在,所以我应该如何将它包含在我的设置文件中,从 django.conf 导入设置打印 settings.TEMPLATE_CONTEXT_PROCESSORS,然后在我的 TEMPLATE_CONTEXT_PROCESSORS 添加“django.core.context_processors.request " ??
  • 如果“django.core.context_processors.request”不存在,则将 TEMPLATE_CONTEXT_PROCESSORS 从 shell 输出复制到您的 settings.py 中,并将“django.core.context_processors.request”添加到此列表中。
  • 但还有一个疑问,我应该如何给出动态值,例如它不会接受,rest.id 因为我列出了许多相同模型的实例,所以我应该如何克服那个问题,
  • 我真的不明白,你能再开一个更详细的话题吗?谢谢!
  • 只需打印 {{ request.session }} 它就会显示结构。我的猜测是 {{ request.session.restaurants.rest }} 块。尝试改为:{% for key, value in request.session.restaurants.items %}{{ key }}, {{ value }}{% endfor %} 并像这样从食物链下降。
【解决方案2】:

补充@jpic 响应。
您可以执行以下操作,而不是从 shell 复制内容 TEMPLATE_CONTEXT_PROCESSORS:

from django.conf import global_settings
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
    "django.core.context_processors.request",
)

这样,您的全局设置将被保留。
确保保留尾随逗号,以便 python 可以将其视为元组

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2021-10-09
    • 2015-09-18
    • 2018-03-28
    • 2011-02-02
    • 2014-11-26
    相关资源
    最近更新 更多