2009-05-29 6 views
6

Sto lavorando a un negozio online in Django (solo un carrello di base in questo momento) e sto pensando di aggiungere funzionalità agli utenti per contrassegnare gli elementi come preferiti (proprio come in stackoverflow). I modelli per il carrello hanno un aspetto simile al seguente:Concedere agli utenti anonimi la stessa funzionalità di quelli registrati

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

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

Il modello dei preferiti sarebbe solo una tabella con due righe: utente e prodotto.

Il problema è che questo funzionerebbe solo per gli utenti registrati, poiché ho bisogno di un oggetto utente. Come posso consentire anche agli utenti non registrati di utilizzare queste funzionalità, salvare i dati in cookie/sessioni e quando e se decidono di registrarsi, spostando i dati sul loro utente?

Immagino che un'opzione potrebbe essere una sorta di relazioni generiche, ma penso che sia un po 'complicato. Forse avere una riga in più dopo l'utente che è un oggetto di sessione (non ho mai utilizzato le sessioni in django fino ad ora) e se l'Utente è impostato su Nessuno, usa quello?

Quindi, in sostanza, quello che voglio chiedere è se hai già avuto questo problema, come lo hai risolto, quale sarebbe l'approccio migliore?

risposta

9

Non l'ho fatto prima ma dalla lettura della descrizione creerei semplicemente un oggetto utente quando qualcuno ha bisogno di fare qualcosa che lo richiede. Quindi si invia all'utente un cookie che si collega a questo oggetto utente, quindi se qualcuno ritorna (senza cancellare i cookie) ottiene lo stesso oggetto utente scheletro.

Ciò significa che è possibile utilizzare il codice corrente con modifiche minime e quando si desidera migrare a un utente registrato completo è possibile popolare l'oggetto utente scheletro con i relativi dettagli.

Se si desidera mantenere ordinato il DB, è possibile aggiungere un'attività che cancella tutti gli utenti scheletrici che non sono stati utilizzati negli ultimi 30 giorni.

+0

+1: gli utenti anonimi hanno ancora indirizzi IP che possono essere utilizzati per creare un ID utente temp necessario senza password. Quando si registrano, in realtà li stai aggiornando per avere un nome e una password corretti. –

+0

Bella idea, non ci ho pensato. Grazie! –

+4

L'indirizzo IP non può essere utilizzato come chiave univoca. Pensa a più utenti dietro NAT firewall. – tzot

2

Basta salvare i dati utente nella tabella utente e non inserire le tabelle userid/password.

se un utente si registra, è sufficiente compilare questi campi.

È necessario disporre di uno script di "pulizia" eseguito periodicamente per eliminare tutti gli utenti che non hanno visitato in un periodo arbitrario. Farei questa pulizia opzionale. e avere uno script che può essere eseguito sul lato server (o tramite un'interfaccia di amministrazione Web) per cancellare nel caso in cui il cliente voglia farlo manualmente.

Ricordare di eliminare tutte le voci correlate e la voce utente.

4

A me sembra che il modo più semplice per farlo sarebbe quello di memorizzare sia l'ID utente o l'ID di sessione:

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

Poi, quando un utente si registra, si può prendere il loro request.session.session_key e aggiornare tutte le righe con il loro nuovo id utente.

Meglio ancora, è possibile definire un modello "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) 

E allora non resta che aggiornare la tabella userProxy al momento della registrazione, e nulla circa il carro deve cambiare.

+0

Vuoi 'unique = True' nella riga' user = models.ForeignKey (User, unique = True, null = True) '. Quindi non puoi avere più utenti "nulli" definiti dalla loro sessione, puoi? –

0

Penso che tu fossi sulla buona strada pensando di utilizzare le sessioni.Vorrei memorizzare un elenco di ID prodotto nella sessione degli utenti e quindi quando l'utente si registra, creare un carrello come è stato definito e quindi aggiungere gli articoli. Controlla il session docs.

È possibile consentire alle persone che non hanno effettuato l'accesso o che non dispongono di un account per aggiungere elementi a un carrello "temporaneo". Quando la persona accede a uno dei due account o crea un nuovo account, aggiungi tali articoli al loro carrello "reale". Quindi, aggiungendo poche righe al tuo 'aggiungi oggetto al carrello' e alle funzioni di accesso, puoi utilizzare i tuoi modelli esistenti.