2014-10-10 181 views
2

是否可以读取模板标签中的cookie?Django在模板标签中读取cookie

我在中间件中设置cookie,但我想读取模板标签。

def process_response(self, request, response): 
    response.set_cookie('changed', 'yes') 
    response.set_cookie('choose', request.LANGUAGE_CODE) 
    return response 

感谢

回答

3

你必须创建一个模板标签与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 
+1

这假定cookie存在。否则使用:result = request.COOKIES.get(cookie_name,'') – jonincanada 2016-11-23 18:15:54

+0

@jonincanada我改变了答案,谢谢 – 2016-11-24 17:32:53

2

马科斯的答案应该被接受。

以下是我用马科斯的答案在我的情况:

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 

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 

请注意,marktags.py文件,我有我所有的自定义过滤器,是stored inside the templatetags directory (对我来说,我使用的Django allauth所以我在myapp/allauth/account/templatetags文件夹中保存我的自定义文件marktags.pytemplate_tags.py文件旁)

3 - 最后,hello.html的包括以下内容:

<head> 
    {% load marktags %} 
</head> 

<body> 
    {{ person_name }} is {% cookie 'the_new_number' %} years old. 
</body> 

注意{%语法,不{{访问该cookie

这里是another example

如果您不喜欢cookies,我建议您使用扩展名,如 EditThisCookie。 您只能看到服务器了解如何显示此人的姓名,但浏览器的cookie包含此人的年龄值

2

由于Cookie是键/值对,因此您可以使用模板读取模板中cookie的值点符号如下所示。

在您的观点:

def process_response(self, request, response): 
response.set_cookie('changed', 'yes') 
response.set_cookie('choose', request.LANGUAGE_CODE) 
return response 

而且在你的模板:

{{ request.COOKIES.cookie_name }} 
+1

Simples :)虽然可能最好把它包装在一个'{%if request.COOKIES.cookie_name%} '。 – zelanix 2017-01-14 19:43:05

+0

@zelanix,为了安全起见。我同意 – Hmatrix 2017-01-22 13:41:08