Frage

Ich arbeite an einer kleinen Intranetseite für ein kleines Unternehmen, auf der Benutzer Beiträge posten können sollten.Ich habe mir einen sehr einfachen Authentifizierungsmechanismus vorgestellt, bei dem die Leute einfach ihre E-Mail-Adresse eingeben und eine eindeutige Anmelde-URL erhalten, die ein Cookie setzt, das sie bei zukünftigen Anfragen immer identifiziert.

In meinem Vorlagen-Setup habe ich base.html und die anderen Seiten erweitern dies.Ich möchte die Schaltfläche „Angemeldet“ oder „Registrieren“ in der Datei „base.html“ anzeigen, aber wie kann ich sicherstellen, dass die erforderlichen Variablen immer Teil des Kontexts sind?Es scheint, dass jede Ansicht den Kontext einfach so einrichtet, wie sie möchte, und dass es keine globale Kontextpopulation gibt.Gibt es eine Möglichkeit, dies zu tun, ohne den Benutzer in jede Kontexterstellung einzubeziehen?

Oder muss ich meine eigenen benutzerdefinierten Verknüpfungen erstellen, um den Kontext richtig einzurichten?

War es hilfreich?

Lösung

Im allgemeineren Sinne, dass Sie Variablen nicht in jeder Ansicht explizit festlegen müssen, klingt es so, als ob Sie überlegen möchten, Ihre eigenen zu schreiben Kontextprozessor.

Aus den Dokumenten:

Ein Kontextprozessor hat eine sehr einfache Schnittstelle:Es handelt sich lediglich um eine Python-Funktion, die ein Argument, ein HttpRequest-Objekt, entgegennimmt und ein Wörterbuch zurückgibt, das dem Vorlagenkontext hinzugefügt wird.Jeder Kontextprozessor muss ein Wörterbuch zurückgeben.

Andere Tipps

Es gibt keine Notwendigkeit um einen Kontextprozessor für das Benutzerobjekt zu schreiben, falls Sie das bereits haben "django.core.context_processors.auth" In TEMPLATE_CONTEXT_PROCESSORS Und wenn Sie verwenden RequestContext in euren Ansichten.

Wenn Sie Django 1.4 oder höher verwenden, wurde das Modul verschoben django.contrib.auth.context_processors.auth

@Ryan:Die Dokumentation zu Präprozessoren ist etwas klein

@Staale:Hinzufügen eines Benutzers zum Kontext jedes Mal, wenn die angezeigte Vorlage aufgerufen wird, DRY

Die Lösung besteht darin, einen Präprozessor zu verwenden

A:Fügen Sie in Ihren Einstellungen hinzu

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user',
)

B:In myapp/processor_file_name.py einfügen

def user(request):
    if hasattr(request, 'user'):
        return {'user':request.user }
    return {}

Von nun an können Sie Benutzerobjektfunktionen in Ihren Vorlagen verwenden.

{{ user.get_full_name }}

Die Hinweise sind in jeder Antwort enthalten, aber noch einmal von Grund auf für Neulinge:

Authentifizierungsdaten sind (fast) standardmäßig in Vorlagen enthalten – mit einem kleinen Trick:

In views.py:

from django.template import RequestContext
...
def index(request):
    return render_to_response('index.html', 
                              {'var': 'value'},
                              context_instance=RequestContext(request))

In index.html:

...
Hi, {{ user.username }}
var: {{ value }}
... 

Von hier: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

Diese Vorlagenkontextvariable ist nicht verfügbar, wenn a RequestContext wird nicht verwendet.

@DAVE Um {{user.username}} in meinen Vorlagen zu verwenden, muss ich dann RequestContext verwenden und nicht nur eine normale Karte/Hash: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

Ich vermute also, dass es keine globalen Werte gibt, die von der Template-Engine überprüft werden.

Aber der RequestContext verfügt über einige vorab ausgefüllte Klassen, die ich mir ansehen kann, um meine Probleme zu lösen.Danke.

Wenn Sie Ihre Authentifizierung in das einbinden können Django-Authentifizierungsschema Sie können es verwenden request.user.

Ich denke, das sollte nur ein Anruf sein authenticate() Und login() basierend auf dem Inhalt Ihres Cookies.

Bearbeiten:@Staale – ich benutze immer das locals() Trick für meinen Kontext, damit alle meine Vorlagen sehen können request und so request.user.Wenn nicht, wäre es wohl nicht so einfach.

Dies ist standardmäßig möglich. Stellen Sie durch die folgenden Schritte sicher, dass Sie den Kontext „django.contrib.auth.context_processors.auth“ in Ihren Einstellungen hinzugefügt haben.Standardmäßig wird es in „settings.py“ hinzugefügt, sieht also so aus

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)

Und Sie können auf das Benutzerobjekt wie folgt zugreifen:

{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
    <p>Welcome, new user. Please log in.</p>
{% endif %}

Weitere Informationen finden Sie hier http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

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