Предоставление анонимным пользователям той же функциональности, что и зарегистрированным - PullRequest
6 голосов
/ 29 мая 2009

Я работаю в интернет-магазине в 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")

Модель избранного - это просто таблица с двумя строками: user и product.

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

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

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

Ответы [ 4 ]

9 голосов
/ 29 мая 2009

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

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

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

4 голосов
/ 29 мая 2009

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

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 при их регистрации, и ничего в корзине не должно измениться.

2 голосов
/ 29 мая 2009

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

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

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

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

0 голосов
/ 29 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...