Seite 1 von 1
Django Template
Verfasst: Montag 6. Oktober 2008, 17:15
von nemomuk
Hallo,
ich versuche gerade soetwas hier zu machen:
Code: Alles auswählen
{{ if user.is_authenticated }}
<small>Angemeldet als <strong>{{ user.username }}</strong>. <a href="/logout/">Abmelden</a></small>
{{ endif }}
Da ich aber erstens nicht jedes mal request.user beim rendern "Mitsenden" will und zweitens das is_authenticated nicht funktioniert, versuche ich das irgendwie anders zu lösen. Das hier soll auf jeder Seite sein (in der base.html, die per "extends" erweitert wird.)
Wie kann ich das machen?
Danke!
Verfasst: Montag 6. Oktober 2008, 17:17
von zero-one
bei dem if user.is_authenticated muessten es doch glaub {% %} statt {{}} sein oder ?
beim anderen kann ich leider nicht helfen
Verfasst: Montag 6. Oktober 2008, 17:21
von nemomuk
jo, funktionieren tut es jetzt, nur will ich halt nicht jedes mal bei render_to_response das request.user mitsenden. Jemand eine Idee?
Verfasst: Montag 6. Oktober 2008, 18:10
von Leonidas
SchneiderWeisse hat geschrieben:Jemand eine Idee?
Kannst du in Django so gut wie vergessen. Den User must du sowieso in das Template geben, woher soll den das Template wissen für wen es gerendert wird?
Vielleicht kannst du ja den RequestContext statt des normalen Context verwenden, der dann wohl die Variable ``request`` automatisch ans Template gibt.
Verfasst: Montag 6. Oktober 2008, 19:21
von sma
SchneiderWeisse, wenn du an den Context-Processors in der settings.py nicht herumgefummelt hast, solltest du
automatisch eine Variable "user" in deinen Templates haben. Weitere Variablen kannst du über weitere Context-Processors hinzufügen.
Ein subtiler Fehler ist, wenn man keinen RequestContext, sondern ein einfaches dict() als Parameter von `
render_to_response` benutzt. Dann funktionieren die Context-Processors nicht.
Ich finde die neue Doku total unübersichtlich und kann daher nicht mit besseren Links dienen.
Stefan
Verfasst: Montag 6. Oktober 2008, 19:28
von nemomuk
ich habe es bereits gefunden, danke für eure Hilfe!
Code: Alles auswählen
from django.template import RequestContext
def view(request):
return render_to_response('index.html', dict, context_instance = RequestContext(request))
Code: Alles auswählen
TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.request",
)
dann kann ich per request.user drauf zugreifen, alternativ kann man auch "auth" einbinden und direkt per "user" ansprechen.
Eine grundsätzliche Frage:
Ist es besser in jeder Funktion einzeln die Module zu importieren die man braucht oder am Seitenanfang?
Code: Alles auswählen
from django.template import RequestContext
from django.shortcuts import render_to_response, get_object_or_404
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
@login_required
def start(request):
from django.contrib.auth.models import User
from django.shortcuts import get_list_or_404
Weil es oben etwas unübersichtlich ist...
Verfasst: Montag 6. Oktober 2008, 20:22
von Leonidas
Ich würde es im Modulkopf machen, eben weil es übersichtlicher ist, da alle Importe gruppiert sind und auf den ersten Blick ersichtlich ist was von einem Modul woher genommen wird. Importe auf Funktionslevel sollte man nur machen, wenn es nicht anders geht, zum Beispiel um zirkuläre Importe zu vermeiden oder weil man in einigen Funktionen optional bestimmte Module braucht, deren Importe im Kopf das laden des gesamten Moduls wegen ihrer ImportErrors fehlschlagen lassen würden.
*Insert usual rant about RequestContext here*
Verfasst: Montag 6. Oktober 2008, 21:07
von nemomuk
allerdings habe ich gerade ein problem:
Code: Alles auswählen
{% if request.user.has_perm "projekt.bearbeiten" %}
<!-- irgendwas -->
{% endif %}
Wie kann ich jetzt an die Funktion "request.user.has_perm" übergeben, welche Permission der User haben soll?
Verfasst: Dienstag 7. Oktober 2008, 17:51
von Dauerbaustelle
Code: Alles auswählen
class Permissions:
permissions = {}
permissions['projekt.bearbeiten'] = False
def has_perm(self, permission):
try:
return permissions[permission]
except:
return False # raise PermissionDoesNotExist o.ä.
userperm = Permissions()
userperm.permissions['projekt.bearbeiten'] = True
render_to_response("template.html", permissions=userperm)
Code: Alles auswählen
{% if permissions.has_perm "projekt.bearbeiten %}
blubb
{% endif %}
So zum Beispiel. Nicht schön, aber es tut :)
Verfasst: Dienstag 7. Oktober 2008, 19:13
von nemomuk
danke ahbe es aber bereits anders gelöst: