2009-05-29 4 views
6

Я работаю над онлайн-магазином в Django (сейчас это только базовая корзина покупок), и я планирую добавить функциональность для пользователей, чтобы отмечать элементы как любимые (так же, как и в stackoverflow). Модели для корзины выглядят примерно так:Предоставление анонимным пользователям той же функции, что и зарегистрированной

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

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

Модель избранного будет всего лишь столом с двумя рядами: пользователем и продуктом.

Проблема в том, что это будет работать только для зарегистрированных пользователей, так как мне нужен пользовательский объект. Как я могу также позволить незарегистрированным пользователям использовать эти функции, сохраняя данные в файлах cookie/сеансах и когда и если они решают зарегистрироваться, перемещая данные к своему пользователю?

Я думаю, что один из вариантов был бы своего рода родовыми отношениями, но я думаю, что это немного сложно. Возможно, с дополнительной строкой после пользователь это объект сеанса (я до сих пор не использовал сеансы в django), и если для пользователя установлено значение None, используйте это?

Так что, в основном, я хочу спросить, есть ли у вас эта проблема раньше, как вы ее решили, какой был бы лучший подход?

ответ

9

Я не делал этого раньше, но, читая ваше описание, я просто создавал бы пользовательский объект, когда кто-то должен был делать что-то, что ему нужно. Затем вы отправляете пользователю cookie, который ссылается на этот пользовательский объект, поэтому, если кто-то возвращается (без очистки их файлов cookie), они получают один и тот же скелетный пользовательский объект.

Это означает, что вы можете использовать свой текущий код с минимальными изменениями, и когда они хотят перейти на полностью зарегистрированного пользователя, вы можете просто заполнить объект пользовательского скелета своими деталями.

Если вы хотите сохранить свой БД tidy-ish, вы можете добавить задачу, которая удаляет всех скелетов. Пользователи, которые не использовались в течение последних 30 дней.

+0

+1: анонимные пользователи по-прежнему имеют IP-адреса, которые могут быть использованы для создания необходимого временного пользователя без пароля. Когда они регистрируются, вы фактически обновляете их, чтобы иметь правильное имя и пароль. –

+0

Хорошая идея, я об этом не думал. благодаря! –

+4

IP-адрес не может использоваться как уникальный ключ. Подумайте о нескольких пользователях за NAT. – tzot

2

Просто сохраните данные пользователя в таблице пользователя и не заполняйте таблицы пользователя и пароля.

Если пользователь регистрируется, вам просто нужно заполнить эти поля.

Вы должны будете периодически запускать скрипт «очистки», чтобы очистить всех пользователей, которые не посещали в какой-то произвольный период. Я бы сделал эту очистку опциональной. и иметь сценарий, который можно запустить с помощью сервера (или через интерфейс веб-администратора), чтобы очистить его, если ваш клиент хочет сделать это вручную.

не забудьте удалить все связанные записи, а также запись пользователя.

4

Кажется мне, что самый простой способ сделать это было бы хранить как идентификатор пользователя или идентификатор сеанса:

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

Затем, когда пользователь регистрируется, вы можете взять их request.session.session_key и обновить все строки с их новым идентификатором пользователя.

еще лучше, вы могли бы определить «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) 

Итак вы просто должны обновить таблицу UserProxy при регистрации, и ничего о телеге не должно измениться.

+0

Вы хотите 'unique = True' в строке' user = models.ForeignKey (User, unique = True, null = True) '. Тогда вы не можете иметь несколько «нулевых» пользователей, определенных их сеансом, не так ли? –

0

Я думаю, что вы были на правильном пути, думая об использовании сеансов.Я бы сохранил список идентификаторов продукта в сеансе пользователей, а затем, когда пользователь регистрируется, создайте корзину, как вы определили, а затем добавьте элементы. Проверьте session docs.

Вы можете разрешить людям, которые либо не вошли в систему, либо не имеют учетной записи, чтобы добавить элементы в корзину «temp». Когда пользователь регистрируется в любой учетной записи или создает новую учетную запись, добавьте эти предметы в свою «реальную» корзину. Затем, просто добавив несколько строк в «добавление товара в корзину» и функции входа в систему, вы можете использовать существующие модели.

Смежные вопросы