2012-12-18 8 views
21

Ich habe ein django Modell, die Benutzerdaten und Produkt aus einem Formular Eingabe speichert:Django Speicherung anonyme Benutzer Daten

def ProductSelection(request, template_name='product_selection.html'): 
    ... 
    if user.is_authenticated(): 
     user = request.user 
    else: 
     # deal with anonymous user info 
    project = Project.objects.create(
     user=user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"], 
    ) 

Natürlich ist die für authentifizierte Benutzer in Ordnung, aber ich mag auch in der Lage sein, anonym zu speichern Benutzerprojekte, und wenn möglich, verknüpfen Sie sie mit dem Benutzer, wenn sie sich schließlich registrieren und authentifizieren.

Meine Idee ist es, anonyme Benutzer mit Name = Some_Variable (Zeitstempel verkettet mit einem zufälligen Hash?), Dann speichern Sie diesen Benutzernamen in Sitzungsdaten. Wenn ich sicherstelle, dass diese Sitzungsvariable, falls vorhanden, verwendet wird, um alle Projektaktivitäten dieses Benutzers aufzuzeichnen, sollte ich in der Lage sein, die Projekte mit den echten Anmeldeinformationen des Benutzers zu aktualisieren, wenn sie sich registrieren.

Ist das übermäßig kompliziert und brüchig? Würde ich riskieren, Tausende von Datenzeilen unnötig zu speichern? Was wäre der optimale Ansatz für dieses gemeinsame Problem?

Jede Anleitung zu diesem Thema wäre sehr willkommen.

Antwort

16

Sie können Django's session framework verwenden, um anonyme Benutzerdaten zu speichern.

können Sie dann entweder ein Feld zu Ihrem Project Modell fügen Sie den session_key Wert für anonyme Benutzer zu halten,

project = Project.objects.create(
    user=request.user, # can be anonymous user 
    session=request.session.session_key, 
    product=form.cleaned_data["product"], 
    quantity=form.cleaned_data["product_quantity"]) 

oder einfach speichern alle Daten ein Projektinstanz in der Sitzung haben würde

if user.is_authenticated(): 
    project = Project.objects.create(
     user=request.user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"]) 
else: 
    # deal with anonymous user info 
    request.session['project'] = { 
     "product": form.cleaned_data["product"], 
     "quantity": form.cleaned_Data["product_quantity"]} 

Sie können die Daten aus der Sitzung später abrufen, wenn Sie einen richtigen Benutzer erstellen.

+0

Wenn ich in der Vergangenheit auf ähnliche Probleme stieß, kommt das Problem, wenn Sie zurück in die andere Richtung gehen müssen. Zum Beispiel, wenn Benutzer mehrere Projekte haben könnten, und Sie müssen etwas tun, um zu sehen, welche Sitzungen zwei bestimmte Projekte gefallen haben. – JeffS

+0

In meinem Fall möchte ich die anonymen Benutzerdaten sowohl in der Datenbank speichern als auch über Sitzungen mit einem bestimmten Benutzer verknüpfen. Wenn 'user = request.user' ein anonymes Benutzerobjekt zurückgibt, kann ich diese Information später nicht mehr bei der Registrierung an den Benutzer binden. –

+1

In diesem Fall sollte mein erstes Beispiel es tun: füge ein Feld hinzu, um den 'session_key' Wert zu behalten und du kannst später die gewünschte Projektinstanz abrufen und mit dem neuen Benutzer in Verbindung bringen, wenn der anonyme Benutzer anonym bleibt :-) –

7

Nur um zu klären, der folgenden Code ist, wie die Lösung in meinem Fall implementiert:

 project = Project.objects.create(
      session=request.session.session_key, 
      # save all other fields 
      ... 
     ) 
     if request.user.is_authenticated(): 
      project.user = request.user 
     else: 
      # make a copy of the session key 
      # this is done because the session_key changes 
      # on login/ register 
      request.session['key_copy'] = request.session.session_key 
     project.save() 

Und in meinem models.py:

class Project(models.Model): 
    user = models.ForeignKey(User, null=True, blank=True) 
    ... 

So ein Benutzerfeld null sein kann, und In diesem Fall verwenden wir den Schlüssel session_key, um den Überblick zu behalten.

Verwandte Themen