2009-09-13 3 views
5

Jedes Mal, wenn ich eine Seite öffne, möchte ich die aktuell aktive Projekt-ID erhalten. Dies wird durch Checken der Subdomain und Überprüfen des aktuell angemeldeten Benutzers erreicht.Django-Optionen, um Variablen weithin verfügbar zu machen

Sobald ich meine Ansicht erreichen möchte ich in der Lage sein, zu tun

tasks = Task.objects.filter(project = current_project) 

wo current_project (oder CURRENT_PROJECT oder current_project ???) hat Setup bereits.

Kann mir jemand die Vor-/Nachteile der verschiedenen Ansätze, die ich in den Dokumenten gefunden habe, erklären und mich auf den richtigen Weg bringen?

  1. Sessions
  2. Middleware
  3. Threading
  4. builtins

Dies war, wie ich es am Ende tat

Decorator:

def check4project(fn): 

    current_project = 'fred' 
    def check(*args, **kw): 
     kw['project']=current_project 
     return fn(*args, **kw) 
    return check 

Beispiel anzeigen

@login_required 
@check4project 
@tweetpost 
def index(request, project=0): 

    print project 

Antwort

4

Es hängt alles davon ab, was Ihre Semantik des "aktuellen Projekts" ist. Hier einige Möglichkeiten:

  1. Es könnte eine Eigenschaft des Benutzers sein: Er besucht seine Profilseite und setzt ein aktuelles Projekt. Dies würde in der Datenbank gespeichert werden, und Sie würden mit dem ORM darauf zugreifen.

  2. Es könnte eine Eigenschaft der URL sein, die nur auf Subdomain basiert. Dies könnte mit Middleware geschehen, die Zugriff auf die Anfrage hat, und könnte beispielsweise den Host-Namen analysieren und ein benutzerdefiniertes Attribut für die Anfrage festlegen, auf die Sie in Ihren Ansichtsfunktionen zugreifen könnten.

  3. Ähnlich wie # 2 könnten Sie einen Ansichtsdekorator verwenden, wenn das Überprüfen von Projekten für einige Ansichten durchgeführt wird, aber nicht für alle. Dies ist vergleichbar mit Djangos Dekoratoren zum Überprüfen der Autorisierung.

  4. Es könnte ein Merkmal des Besuchs des Benutzers auf der Website sein: Er besucht eine Seite von Projekten, wählt eine aus, an der gearbeitet wird, und es ist klebrig, bis er ein anderes Projekt wählt. Dies wäre am besten in der Sitzung gespeichert, die speziell für diese Art von vorübergehenden Speicher ist.

Aus Ihrer Beschreibung, es sounsd wie # 2 oder # 3 ist das Beste für Sie, je nachdem, wie Sie Ihre Ansichten teilen, um über die Teilprojekte zwischen Pflege und nicht.

+0

Danke für Ihre hilfreiche Antwort, es hat geholfen, die verschiedenen Optionen für mich zu klären. Ich mag den Sound von 3. weil es eine einfache Möglichkeit ist, den Benutzer zu validieren hat Zugriff auf das Projekt zur gleichen Zeit und die meisten, aber nicht alle Ansichten müssen das Projekt bewusst sein. – PhoebeB

+0

+1 für einen Ansichtsdekorateur. –

0

Haben Sie darüber nachgedacht eine custom template tag?

+0

Meistens möchte ich dies in der Ansicht vor dem Aufruf der Vorlage aber danke für den Beitrag. – PhoebeB

1

Sie könnten einen context_processor erstellen und dann Ihren Wert aus dem Anfrageobjekt abrufen.

+0

ein context_processor wäre nicht die beste Lösung für dieses Problem, aber es löst eine andere, die ich hatte! Vielen Dank. – PhoebeB

Verwandte Themen