В 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(),

Другие вопросы по тегам