是否可以读取模板标签中的 cookie?
我在中间件中设置了 cookie,但我想读取模板标签。
def process_response(self, request, response):
response.set_cookie('changed', 'yes')
response.set_cookie('choose', request.LANGUAGE_CODE)
return response
Run Code Online (Sandbox Code Playgroud)
谢谢
你必须用takes_context创建一个模板标签
@register.simple_tag(takes_context = True)
def custom_template_tag_name(context, value1, value2):
request = context['request']
result = request.COOKIES.get('cookie_name', '')
return result
Run Code Online (Sandbox Code Playgroud)
马科斯的回答应该被接受。
以下是我如何在我的案例中使用 Marcos 的回答:
1 - Django 视图(在 views.py 中):
from django.shortcuts import render_to_response
def helloWorld(request):
response = render_to_response("awesomeapp/hello.html", {
'person_name': "Mark"
}, context_instance=RequestContext(request))
person_age = 26
response.set_cookie('the_new_number', person_age, max_age = 5000000) # 5million secs is almost two months, adjust as appropriate
return response
Run Code Online (Sandbox Code Playgroud)
2 - 在 marktags.py 中:
# To read cookies within django template, from http://stackoverflow.com/questions/26301447/django-read-cookie-in-template-tag
@register.simple_tag(takes_context = True)
def cookie(context, cookie_name): # could feed in additional argument to use as default value
request = context['request']
result = request.COOKIES.get(cookie_name,'') # I use blank as default value
return result
Run Code Online (Sandbox Code Playgroud)
请注意,我拥有所有自定义过滤器的 marktags.py 文件存储在templatetags目录中
(在我的情况下,我使用 django-allauth,因此我将自定义文件保存marktags.py在template_tags.py文件myapp/allauth/account/templatetags夹中的文件旁边)
3 - 最后,hello.html 包括以下内容:
<head>
{% load marktags %}
</head>
<body>
{{ person_name }} is {% cookie 'the_new_number' %} years old.
</body>
Run Code Online (Sandbox Code Playgroud)
注意{%语法,不是{{为了访问cookie
这是另一个例子
如果您不熟悉cookie,我建议您使用EditThisCookie等扩展程序 。你可以看到只有服务器知道这个人的名字是如何显示的,但是浏览器的 cookie 包含了这个人的年龄值
由于 cookie 是键/值对,您可以使用点表示法读取模板中 cookie 的值,如下所示。
在您看来:
def process_response(self, request, response):
response.set_cookie('changed', 'yes')
response.set_cookie('choose', request.LANGUAGE_CODE)
return response
Run Code Online (Sandbox Code Playgroud)
在你的模板中:
{{ request.COOKIES.cookie_name }}
Run Code Online (Sandbox Code Playgroud)