В Django возможно ли получить доступ к текущему сеансу пользователя из контекста родительского шаблона в теге включения?
Как мы знаем, если мы хотим получить доступ к сеансу пользователя из контекста внутри тега включения, вы можете использовать takes_context
аргумент и передать контекст запроса в представлении.
Но в моем проекте это сложнее:
Вид прост:
# views.py
def index(request):
form = PersonForm()
return render(request, 'add.html', {'form': form})
Шаблоны:
# templates/add.html
<html>
<head>
<title>Add Person</title>
</head>
<body>
<form enctype="multipart/form-data" action="" method="post">
{{ form.as_p }}
</form>
{% render_attachments %}
...
</body>
</html>
# templates/list.html
{% load my_tags %}
<div class="attachments" style="margin:12px 0 12px 0;">
{% for attachment in attachments %}
<a href="{{ attachment.attachment_file.url }}">{{ attachment.filename }}
</a>
{% attachment_delete_link attachment %}
{% endfor %}
</div>
Вот мои пользовательские теги:
# my_tags.py
@register.inclusion_tag('attachments/list.html', takes_context=True)
def render_attachments(context):
session = context['request'].session
return {'attachments': session.get('attachments', [])}
@register.inclusion_tag('attachments/delete_link.html', takes_context=True)
def attachment_delete_link(context, attachment):
if context['user'] == attachment.creator:
return {
'delete_url': reverse('delete_attachment',
kwargs={'attachment_pk': attachment.pk})
}
return {'delete_url': None}
Когда я запускаю свой проект, я получаю следующую ошибку:
KeyError at /person/
'user'
Request Method: GET
Request URL: http://localhost:8000/person/
Django Version: 1.5.1
Exception Type: KeyError
Итак, я печатаю контекст внутри двух тегов, чтобы выяснить, что произошло, казалось, что контекст запроса не перешел в attachment_delete_link
Как я могу решить эту проблему?
1 ответ
Решение
Вы перезаписываете весь контекст в render_attachments()
ты должен вернуться
def render_attachments(context):
# some code...
context['attachments'] = session.get('attachments', [])
return context
То же самое касается attachment_delete_link()
,