2009-12-22 6 views
5

Ich habe stundenlang gearbeitet, um das folgende Problem zu verstehen: Ich habe einen Benutzer senden eine Ajax-Anfrage, um dynamisch ein Formular zu senden und aufzuzeichnen, dass die Anzahl der Formulare beim Einreichen erhöht hat. Zu diesem Zweck verwende ich request.session['editing_foo'] = { 'prefix_of_form_elements' : pkey }, so dass ich sie mit der Datenbank zum Speichern und Laden verknüpfen kann (-1 ist für neue Formulare, die noch nicht gespeichert wurden).Django-Sitzung persistent, aber verlierende Daten

Allerdings, wenn ich den folgenden Code verwenden (siehe unten) ich folgende bizarre Ausgabe:

1. Klicken Sie auf:

{} foousername 
next_key 1 
1 
{u'1-foo': -1} 

2. Klicken Sie auf:

{} foousername 
next_key 1 
1 
{u'1-foo': -1} 

3. Anfrage:

{} foousername 
next_key 1 
1 
{u'1-foo': -1} 

Was zum Teufel ist los?

id_fetcher = re.compile(r'\d') 


@login_required 
def ajax_add_foo(request): 
    def id_from_prefix(key): 
     return int(id_fetcher.search(key).group(0)) 

    if 'editing_foos' not in request.session: 
     print "reinitializing" 
     request.session['editing_foos'] = {} 

    print request.session['editing_foos'], request.user 
    keys = request.session['editing_foos'].keys() 
    if len(keys) == 0: 
     next_key = 1 
    else: 
     print [ id_from_prefix(key) for key in keys ] 
     next_key = max([ id_from_prefix(key) for key in keys ]) + 1 
    print "next_key", next_key 

    fooform = FooForm(prefix=next_key) 
    print next_key 

    request.session['editing_foos'].update({create_prefix(FooForm, next_key) : -1 }) # This quote is new and has no pkey 
    print request.session['editing_foos'] 

    return render_to_response('bar/foo_fragment.html', 
           {'fooform' : fooform, }, 
           context_instance=RequestContext(request)) 

Vielen Dank allen!

Hinweis: Dies ist eine Folge zu einer previous question über den gleichen Quellcode.

Antwort

11

Ich glaube nicht, dass ich die Frage ganz verstehen, aber Sie können, an dem Sie einen Blick nehmen wollen session engine Sie verwenden

wenn Sie den Cache-Session-Engine verwenden müssen Sie stellen Sie sicher, haben Caching richtig eingerichtet (zum Beispiel der Dummy-Cache würde einfach Ihre Sitzungsdaten wegwerfen)

Eine andere Möglichkeit ist, dass Ihre Sitzung nicht gespeichert wird, weil Sie die Sitzung nicht ändern, ändern Sie ein veränderbares Objekt, das wird in der Sitzung gespeichert. Sie können forcing the session to save versuchen, indem Sie dieses irgendwo in Ihrer Ansicht hinzufügen:

request.session.modified = True 
+0

Schön! Du bist ein Genie! Ich habe diese Option nie in den Dokumenten erwähnt! – SapphireSun

+0

Sie sparen mein Leben! Habe das nicht in der Doku gesehen –

+0

Danke bro ..! Du sparst meine Tage: P –

Verwandte Themen