Как отправить сообщение сеанса анонимному пользователю на сайте Django?

StackOverflow https://stackoverflow.com/questions/697902

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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 %}

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

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

Дополнительная информация здесь:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top