2009-05-29 10 views
6

Pracuję w sklepie internetowym w Django (teraz tylko podstawowym koszyku) i planuję dodać funkcjonalność dla użytkowników, aby oznaczyć przedmioty jako ulubione (tak jak w stackoverflow). Modele do koszyka wyglądają mniej więcej tak:Dawanie anonimowym użytkownikom tej samej funkcjonalności co zarejestrowane

class Cart(models.Model): 
    user = models.OneToOneField(User) 

class CartItem(models.Model): 
    cart = models.ForeignKey(Cart) 
    product = models.ForeignKey(Product, verbose_name="produs") 

Model ulubionych to tylko tabela z dwoma wierszami: użytkownik i produkt.

Problem polega na tym, że działa to tylko dla zarejestrowanych użytkowników, ponieważ potrzebuję obiektu użytkownika. Jak mogę również pozwolić niezarejestrowanym użytkownikom korzystać z tych funkcji, zapisując dane w plikach cookie/sesjach oraz kiedy i czy zdecydują się zarejestrować, przenosząc dane do swojego użytkownika?

Domyślam się, że jedna opcja byłaby rodzajem ogólnych relacji, ale myślę, że to trochę skomplikowane. Może mając dodatkowy wiersz po użytkownik to obiekt sesji (tak naprawdę nie używałem sesji w django), a jeśli użytkownik jest ustawiony na Brak, użyj tego?

Zasadniczo chciałbym zapytać, czy wcześniej miałeś ten problem, jak go rozwiązałeś, jakie byłoby najlepsze podejście?

Odpowiedz

9

Nie robiłem tego wcześniej, ale czytając twój opis, po prostu utworzyłbym obiekt użytkownika, gdy ktoś musi zrobić coś, co tego wymaga. Następnie przesyłasz użytkownikowi plik cookie, który łączy się z tym obiektem użytkownika, więc jeśli ktoś wróci (bez usuwania plików cookie), otrzyma ten sam obiekt użytkownika szkieletu.

Oznacza to, że możesz użyć aktualnego kodu przy minimalnych zmianach i kiedy chcesz przeprowadzić migrację do zarejestrowanego użytkownika, możesz po prostu wypełnić obiekt użytkownika szkieletu jego szczegółami.

Jeśli chcesz zachować porządek w DB, możesz dodać zadanie, które usuwa wszystkich szkieletów użytkowników, którzy nie byli używani przez ostatnie 30 dni.

+0

+1: anonimowi użytkownicy nadal mają adresy IP, za pomocą których można utworzyć niezbędny identyfikator użytkownika bez hasła. Gdy się zarejestrują, aktualizujesz je tak, aby uzyskać właściwą nazwę i hasło. –

+0

Niezły pomysł, nie myślałem o tym. dzięki! –

+4

Adres IP nie może być użyty jako klucz unikalny. Myśl o wielu użytkownikach za zaporą NAT. – tzot

2

Po prostu zapisz dane użytkownika w tabeli użytkownika i nie wypełniaj tabel użytkowników/haseł.

jeśli użytkownik się zarejestruje, wystarczy wypełnić te pola.

Będziesz musiał okresowo uruchamiać jakiś skrypt "czyszczenia", aby usunąć wszystkich użytkowników, którzy nie odwiedzili go w jakimś arbitralnym okresie. Uczyniłbym to czyszczenie opcjonalnie. i mieć skrypt, który można uruchomić serveride (lub przez interfejs administratora sieci), aby usunąć na wypadek, gdyby klient chciał zrobić to ręcznie.

Pamiętaj, aby usunąć wszystkie powiązane wpisy, a także wpis użytkownika.

4

Wydaje mi się, że najprostszym sposobem na to byłoby przechowywać zarówno identyfikator użytkownika i identyfikator sesji:

class Cart(models.Model): 
    user = models.ForeignKey(User, null=True) 
    session = models.CharField(max_length=32, null=True) 

Wtedy, gdy rejestry użytkowników, można wziąć ich request.session.session_key i zaktualizować wszystkie wiersze ze swoim nowym identyfikatorem użytkownika.

Jeszcze lepiej, można zdefiniować model „UserProxy”:

class Cart(models.Model): 
    user = models.ForeignKey(UserProxy) 

class UserProxy(models.Model): 
    user = models.ForeignKey(User, unique=True, null=True) 
    session = models.CharField(max_length=32, null=True) 

Więc po prostu trzeba zaktualizować tabelę userProxy podczas rejestracji, a nic o wózku musi się zmienić.

+0

Czy chcesz 'unique = True' w linii' user = models.ForeignKey (User, unique = True, null = True) '. Wtedy nie możesz mieć wielu "zero" użytkowników zdefiniowanych przez ich sesję, prawda? –

0

Myślę, że byłeś na właściwej drodze, myśląc o korzystaniu z sesji.Zapisałbym listę identyfikatorów produktów w sesji użytkowników, a następnie, gdy użytkownik się zarejestruje, utwórz koszyk zgodnie z definicją, a następnie dodaj elementy. Sprawdź numer session docs.

Mogłeś pozwolić ludziom, że nie nastąpiło zalogowanie, lub nie masz konta, aby dodawać elementy do „temp” koszyka. Gdy osoba zaloguje się na jedno z kont lub utworzy nowe konto, dodaj te elementy do swojego "prawdziwego" koszyka. Następnie, dodając kilka linii do "dodaj element do koszyka" i funkcje logowania, możesz użyć istniejących modeli.

Powiązane problemy