2012-12-18 15 views
21

Mam modelu django, która przechowuje dane użytkownika i produktów z wejściem forma:Django przechowywania anonimowych danych użytkownika

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"], 
    ) 

Oczywiście jest to dobre dla uwierzytelnionych użytkowników, ale także chcą być w stanie przechowywać anonimowy projekty użytkowników i jeśli to możliwe, powiąż je z użytkownikiem, gdy w końcu się zarejestruje i uwierzytelni.

Mój pomysł polega na utworzeniu anonimowego użytkownika o nazwie = some_variable (znacznik czasu połączony z losowym hash?), A następnie zapisz tę nazwę użytkownika w danych sesji. Jeśli upewnię się, że ta zmienna sesji, jeśli istnieje, jest używana do rejestrowania wszystkich działań projektu tego użytkownika, powinienem być w stanie zaktualizować projekty za pomocą rzeczywistych poświadczeń użytkownika podczas rejestracji.

Czy to zbyt skomplikowane i kruche? Czy mogę niepotrzebnie oszczędzać tysiące wierszy danych? Jakie byłoby optymalne podejście do tego wspólnego problemu?

Wszelkie wskazówki na ten temat będą mile widziane.

Odpowiedz

16

Możesz użyć Django's session framework do przechowywania anonimowych danych użytkownika.

Można wówczas dodać pole do modelu Project do przechowywania wartości session_key dla anonimowych użytkowników,

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"]) 

lub po prostu zapisać wszystkie dane wystąpienie projekt miałby w sesji

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"]} 

Dane można pobrać z sesji później, podczas tworzenia właściwego użytkownika.

+0

Kiedy już napotkałem podobne problemy w przeszłości, problem pojawia się, gdy trzeba wrócić w innym kierunku. Tak jakby użytkownicy mogli mieć wiele projektów i musieli zrobić coś takiego, aby zobaczyć, które sesje lubią dwa konkretne projekty. – JeffS

+0

W moim przypadku chcę zarówno przechowywać anonimowe dane użytkownika w bazie danych, jak i kojarzyć je z konkretnym użytkownikiem podczas sesji. Jeśli 'user = request.user' zwróci anonimowy obiekt użytkownika, nie mogę później powiązać tych informacji z użytkownikiem podczas rejestracji. –

+1

W takim przypadku, mój pierwszy przykład powinien to zrobić: dodać pole do przechowywania wartości 'session_key', a następnie można pobrać żądaną instancję projektu i powiązać ją z nowym użytkownikiem, gdy anonimowy użytkownik przestanie być anonimowy :-) –

7

Właśnie w celu wyjaśnienia, poniższy kod jest jak wdrożył rozwiązanie w moim przypadku:

 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() 

I w moim models.py:

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

Więc pole użytkownik może być null, a w tym przypadku używamy klucza session_key, aby zachować ścieżkę rzeczy.

Powiązane problemy