Как отправить сеансовое сообщение анонимному пользователю на сайте Django? - PullRequest
6 голосов
/ 30 марта 2009

Я часто показываю сообщения о действиях пользователя вошедшим в систему пользователям в представлениях моего приложения Django, используя:

request.user.message_set.create("message to user")

Как я могу сделать то же самое для анонимных (не авторизованных) пользователей? Для анонимных пользователей не существует request.user, но в документации Django говорится, что с помощью промежуточного программного обеспечения «сессия» вы можете делать то же самое, что и приведенный выше код. Документация Django, которая ссылается на промежуточное программное обеспечение сеанса, утверждает, что это возможно, но я не смог найти, как это сделать из документации сеанса.

Ответы [ 3 ]

7 голосов
/ 31 марта 2009

Вот что я делаю, используя контекстные процессоры:

project/application/context.py (проверить сообщения и добавить их в контекст):

def messages(request):
    messages = {}
    if 'message' in request.session:
        message_type = request.session.get('message_type', 'error')
        messages = {'message': request.session['message'],
                    'message_type': message_type}
        del request.session['message']
        if 'message_type' in request.session:
            del request.session['message_type']
    return messages

project/settings.py (добавить контекст к TEMPLATE_CONTEXT_PROCESSORS):

TEMPLATE_CONTEXT_PROCESSORS = (
    "django.core.context_processors.request",
    "django.core.context_processors.debug",
    "django.core.context_processors.media",
    "django.core.context_processors.auth",
    "project.application.context.messages",  
)

С учетом вышеизложенного функция messages будет вызываться при каждом запросе, и все, что она возвращает, будет добавлено в контекст шаблона. С этим на месте, если я хочу дать пользователю сообщение, я могу сделать это:

def my_view(request):
    if someCondition:
        request.session['message'] = 'Some Error Message'

Наконец, в шаблоне вы можете просто проверить, есть ли ошибки для отображения:

{% if message %}
    <div id="system_message" class="{{ message_type }}">
        {{ message }}
    </div>
{% endif %}

Тип сообщения просто используется для стилизации в зависимости от того, что это такое («ошибка», «уведомление», «успех») и от того, как это настроено, вы можете добавить только 1 сообщение за раз для пользователя, но это все, что мне действительно нужно, так что это работает для меня. Его можно легко изменить, чтобы включить несколько сообщений и тому подобное.

4 голосов
/ 01 апреля 2009

См. http://code.google.com/p/django-session-messages/ до тех пор, пока патч, включающий сообщения, основанные на сеансах, не попадет в дерево Django (как я недавно видел, он помечен для 1.2, поэтому нет надежды на быстрое добавление ...).

Еще один проект с аналогичной функциональностью - Django Flash (http://djangoflash.destaquenet.com/).

4 голосов
/ 30 марта 2009

Храните данные непосредственно в сеансе, который является объектом, похожим на диктовку. Затем в представлении / шаблоне проверьте значение.

Больше информации здесь:

http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

Вы также можете создать класс промежуточного программного обеспечения для проверки объекта сеанса при каждом запросе и выполнять там сборку / разборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...