Django Template

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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!
zero-one
User
Beiträge: 58
Registriert: Dienstag 20. Mai 2008, 20:52

bei dem if user.is_authenticated muessten es doch glaub {% %} statt {{}} sein oder ?

beim anderen kann ich leider nicht helfen
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

jo, funktionieren tut es jetzt, nur will ich halt nicht jedes mal bei render_to_response das request.user mitsenden. Jemand eine Idee?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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*
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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 :)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

danke ahbe es aber bereits anders gelöst:

Code: Alles auswählen

{% if perms.usermanagement.user_edit %}
Antworten