Подтвердить что ты не робот

Как установить cookie в Django, а затем отобразить шаблон?

Я хочу установить cookie внутри представления, а затем отобразить этот вид шаблона. Насколько я понимаю, это способ установить cookie:

def index(request):
    response = HttpResponse('blah')
    response.set_cookie('id', 1)
    return response

Тем не менее, я хочу установить куки файл, а затем создать шаблон, что-то вроде этого:

def index(request, template):
    response_obj = HttpResponse('blah')
    response_obj.set_cookie('id', 1)
    return render_to_response(template, response_obj)   # <= Doesn't work

Шаблон будет содержать ссылки, которые при нажатии будут выполнять другие представления, которые проверяют для cookie, который я устанавливаю. Какой правильный способ сделать то, что я показал во втором примере выше? Я понимаю, что я могу создать строку, содержащую весь HTML для моего шаблона, и передать эту строку в качестве аргумента HttpResponse, но это кажется действительно уродливым. Разве нет лучшего способа сделать это? Спасибо.

4b9b3361

Ответ 1

Вот как это сделать:

from django.shortcuts import render

def home(request, template):
    response = render(request, template)  # django.http.HttpResponse
    response.set_cookie(key='id', value=1)
    return response

Ответ 2

Если вам нужно установить значение cookie при настройке вашего шаблона, вы можете попробовать что-то вроде этого:

def view(request, template):
    # Manually set the value you'll use for rendering
    # (request.COOKIES is just a dictionnary)
    request.COOKIES['key'] = 'val'
    # Render the template with the manually set value
    response = render(request, template)
    # Actually set the cookie.
    response.set_cookie('key', 'val')

    return response

Ответ 3

Принятый ответ устанавливает cookie перед тем, как будет обработан шаблон. Это работает.

response = HttpResponse()
response.set_cookie("cookie_name", "cookie_value")
response.write(template.render(context))

Ответ 4

def index(request, template):
    response = HttpResponse('blah')
    response.set_cookie('id', 1)
    id = request.COOKIES.get('id')
    return render_to_response(template,{'cookie_id':id})