Frage

Ich zeige oft Nachrichten über Benutzeraktionen für eingeloggte Benutzer in meiner Django app Ansichten mit:

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

Wie konnte ich das gleiche tun für anonyme (nicht angemeldet) Benutzer? Es gibt keine request.user für anonyme Benutzer, aber die Django-Dokumentation sagt, dass die „Sitzung“ Middleware verwenden Sie das gleiche wie der obige Code tun können. Die Django-Dokumentation, die auf die Sitzung Middleware verbindet behauptet, es ist möglich, aber ich konnte nicht finden, wie es aus der Sitzung Dokumentation zu tun.

War es hilfreich?

Lösung

Siehe http://code.google.com/p/django-session -Meldungen / bis zum Patch, die sitzungsbasierten Nachrichten landen in Django Baum ermöglicht (wie ich vor kurzem sah es für 1.2 markiert ist, so dass keine Hoffnung für eine schnelle Zugabe ...).

Ein weiteres Projekt mit ähnlicher Funktionalität ist Django Flash ( http://djangoflash.destaquenet.com/ ) .

Andere Tipps

Das ist, was ich tue, mit Kontext-Prozessoren:

project/application/context.py (nach Nachrichten suchen und diese in den Kontext):

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 (fügen Sie den Kontext der 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",  
)

Mit der über der Funktion messages wird bei jeder Anfrage aufgerufen werden und was auch immer es wieder in den Kontext der Vorlage hinzugefügt werden. In diesem Ort, wenn ich ein Benutzer eine Nachricht geben wollen, kann ich dies tun:

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

Schließlich wird in einer Vorlage können Sie einfach überprüfen, ob es Fehler zu sehen sind:

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

Der Nachrichtentyp wird verwendet, nur um Stil je nachdem, was es ist ( „Fehler“, „Hinweis“, „Erfolg“) und die Art und Weise, dass dies Setup Sie nur 1 Nachricht zu einer Zeit für einen Benutzer hinzufügen können, aber das ist alles, was ich jemals wirklich brauchen, so ist es für mich funktioniert. Es könnte leicht für mehrere Nachrichten zu ermöglichen, geändert und so weiter.

Speichern Sie die Daten direkt in der Sitzung, die ein dict artiges Objekt ist. Dann in der Ansicht / Vorlage, dessen Wert überprüfen.

Weitere Informationen finden Sie hier:

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

Sie können auch eine Middleware-Klasse erstellen, für das Session-Objekt auf jede Anfrage zu überprüfen, und führen Sie Ihre Ansammlung / abzureißen es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top