2009-05-29 7 views
6

Estoy trabajando en una tienda en línea en Django (solo un carrito de compras básico en este momento), y planeo agregar funcionalidad para que los usuarios marquen los artículos como favoritos (al igual en stackoverflow). Los modelos para el carro se ven más o menos así:Dando a los usuarios anónimos la misma funcionalidad que los registrados

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

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

El modelo de favoritos sería solo una tabla con dos filas: usuario y producto.

El problema es que esto solo funcionaría para los usuarios registrados, ya que necesito un objeto de usuario. ¿Cómo puedo también permitir que los usuarios no registrados utilicen estas características, guardando los datos en cookies/sesiones, y cuándo y si deciden registrarse, moviendo los datos a su usuario?

Supongo que una opción sería algún tipo de relaciones genéricas, pero creo que es un poco complicado. Tal vez tener una fila extra después de usuario que es un objeto de sesión (realmente no he usado sesiones en django hasta ahora), y si el usuario está configurado como Ninguno, ¿usar eso?

Así que, básicamente, lo que quiero preguntar, es que si ha tenido este problema antes, ¿cómo lo resolvió, cuál sería el mejor enfoque?

Respuesta

9

No he hecho esto antes, pero al leer su descripción simplemente crearía un objeto de usuario cuando alguien necesite hacer algo que lo requiera. A continuación, envía al usuario una cookie que enlaza con este objeto de usuario, por lo que si alguien vuelve (sin borrar sus cookies) obtiene el mismo objeto de usuario esqueleto.

Esto significa que puede usar su código actual con cambios mínimos y cuando desean migrar a un usuario completo registrado puede llenar el objeto de usuario esqueleto con sus detalles.

Si desea mantener su ordenada de base de datos puede agregar una tarea que elimine todos los usuarios de esqueleto que no se hayan utilizado, por ejemplo, en los últimos 30 días.

+0

+1: los usuarios anónimos aún tienen direcciones IP que se pueden usar para crear una ID de usuario temporal necesaria sin contraseña. Cuando se registran, en realidad los está actualizando para tener un nombre y contraseña adecuados. –

+0

Buena idea, no pensé en eso. ¡Gracias! –

+4

La dirección IP no puede usarse como una clave única. Piensa en múltiples usuarios detrás de NAT cortafuegos. – tzot

2

Simplemente guarde los datos de usuario en la tabla de usuario y no llene las tablas de ID de usuario/contraseña.

si un usuario se registra entonces solo tiene que completar esos campos.

Deberá tener algún script de "limpieza" que se ejecute periódicamente para eliminar a los usuarios que no hayan visitado en algún período arbitrario. Haría esta limpieza opcional. y tiene una secuencia de comandos que se puede ejecutar en el lado del servidor (o a través de una interfaz de administración web) para borrar en caso de que su cliente quiera hacerlo manualmente.

recuerde eliminar todas las entradas relacionadas, así como la entrada del usuario.

4

Me parece que la forma más sencilla de hacerlo sería la de almacenar el ID de usuario o el ID de sesión:

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

Entonces, cuando un usuario se registra, puede tomar su request.session.session_key y actualizar todas las filas con su nueva identificación de usuario.

Mejor aún, se podría definir un modelo "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) 

Así que sólo hay que actualizar la tabla userProxy cuando se registran, y nada sobre el carro tiene que cambiar.

+0

¿Desea 'unique = True' en la línea' user = models.ForeignKey (User, unique = True, null = True) '. Entonces no puedes tener múltiples usuarios "nulos" definidos por su sesión, ¿o sí? –

0

Creo que estabas en el camino correcto pensando en usar sesiones.Guardaría una lista de Identificación de Producto en la sesión de los usuarios y luego, cuando el usuario se registre, crea un carro como lo has definido y luego agrega los artículos. Consulte el session docs.

Puede permitir que las personas que no han iniciado sesión o que no tienen una cuenta agreguen elementos a un carrito "temporal". Cuando la persona inicia sesión en cualquiera de las cuentas o crea una cuenta nueva, agregue esos elementos a su carrito "real". Luego, con solo agregar algunas líneas a su 'agregar elemento al carro' y funciones de inicio de sesión, puede usar sus modelos existentes.

Cuestiones relacionadas