2010-12-22 8 views
2

In meinem Django-Projekt baue ich ein Einkaufswagensystem. Ich möchte die Warenkorbdaten in einer Sitzungsvariablen speichern, weiß aber nicht, wo ich sie initialisieren soll.Wo initialisieren Sie Django Session-Variablen?

Ich habe versucht, so etwas wie dies zu tun:

if 'cart' not in request.session: 
    request.session['cart'] = {} 

in einem benutzerdefinierten Kontext-Prozessor, aber der Kontext-Prozessor scheint nicht die Sitzungsdaten zu ändern. Wo sonst würde ich eine Initialisierung wie diese setzen? Ich möchte es nicht an jeden Ort stellen müssen, wo ich Werte aus dem Wagen bekomme.

+0

Der Kontextprozessor wird nur für Vorlagen ausgelöst, die mit einem RequestContext gerendert wurden. Sind Sie sicher, dass Sie anstelle eines einfachen dict- oder Context-Objekts einen RequestContext übergeben? Das funktioniert für mich. –

+0

Das verwirrte mich, denn ja, ich habe sichergestellt, dass ich einen RequestContext übergebe. Tatsächlich wurde anderer Code im Kontextprozessor ausgeführt, der Initialisierungscode jedoch nicht. Vielleicht habe ich etwas anderes verpasst. Unabhängig davon, die anderen beiden Lösungen funktionieren, also werde ich einen von ihnen verwenden. – davidscolgan

Antwort

1

Dies in Middleware (unter der Sitzung Middleware, natürlich) wird sicherstellen, dass es immer eingestellt ist.

+0

das ist wirklich hilfreich, offensichtlich. – ministry

5

Sie könnten es in ein Stück custom request middleware setzen, aber um ehrlich zu sein, ich denke, das wäre hier zuviel. Es ist wahrscheinlich einfacher, den Einkaufswagen zu initialisieren, wenn Sie ihn in Ihrer Ansichtsfunktion benötigen. Beachten Sie, dass Sie request.session.get verwenden können, um automatisch einen Standardwert zu übernehmen, wenn der Wert nicht bereits vorhanden ist. Etwas wie:

def my_view(request): 
    cart = request.session.get('cart', {}) 
    # Do stuff with cart 
    request.session['cart'] = cart 
0

Warum Sie testen tun müssen, wenn Wagen im request.session ist. Warum nicht etwas wie folgt aus:

cart_value = request.session.get('cart',{}) 

Im Grunde, was das tun werden, ist den Wert zurück auf ‚Warenkorb‘ in der Sitzung, und wenn es keine Werte in den Warenkorb gelegt werden dann die leere Wörterbuch zurückzukehren.

0

Ihr Code sollte funktionieren wie mit einem context_processor, vorausgesetzt, Ihre Ansichten verwenden immer RequestContext.

Ich mache genau dasselbe für meinen Wagen, basierend auf Satchmo von ein paar Jahren zurück. Ich habe einen context_processor, wo ich den Warenkorb aus der Sitzung finden und an die Vorlage übergeben. Viele andere Sitzungsänderungen sind auch dort erledigt ...

Also .. Ihr Code sollte so funktionieren wie er ist. Führt es überhaupt aus? Ist es installiert?

Verwandte Themen