Django сохраняет анонимные пользовательские данные
У меня есть модель django, которая хранит данные пользователя и продукта из ввода формы:
def ProductSelection(request, template_name='product_selection.html'):
...
if user.is_authenticated():
user = request.user
else:
# deal with anonymous user info
project = Project.objects.create(
user=user,
product=form.cleaned_data["product"],
quantity=form.cleaned_data["product_quantity"],
)
Конечно, это нормально для аутентифицированных пользователей, но я также хочу иметь возможность хранить анонимные пользовательские проекты и, если возможно, связывать их с пользователем, когда они в конечном итоге регистрируются и аутентифицируются.
Моя идея - создать анонимного пользователя с именем = some_variable (временная метка, связанная со случайным хешем?), а затем сохранить это имя пользователя в данных сеанса. Если я гарантирую, что эта переменная сеанса, если она существует, используется для записи активности всех проектов этого пользователя, я должен иметь возможность обновлять проекты с помощью реальных учетных данных пользователя при их регистрации.
Является ли это чрезмерно сложным и хрупким? Не могу ли я экономить тысячи строк данных без необходимости? Каким будет оптимальный подход для этой общей проблемы?
Любые рекомендации по этому вопросу будут высоко оценены.
Ответы
Ответ 1
Вы можете использовать структуру сеанса Django для хранения анонимных пользовательских данных.
Затем вы можете добавить поле в модель Project
для хранения значения session_key
для анонимных пользователей,
project = Project.objects.create(
user=request.user, # can be anonymous user
session=request.session.session_key,
product=form.cleaned_data["product"],
quantity=form.cleaned_data["product_quantity"])
или просто сохраните все данные, которые будет иметь экземпляр Project в сеансе
if user.is_authenticated():
project = Project.objects.create(
user=request.user,
product=form.cleaned_data["product"],
quantity=form.cleaned_data["product_quantity"])
else:
# deal with anonymous user info
request.session['project'] = {
"product": form.cleaned_data["product"],
"quantity": form.cleaned_Data["product_quantity"]}
Вы можете получить данные из сеанса позже, при создании соответствующего пользователя.
Ответ 2
Чтобы уточнить, приведенный ниже код - это то, как реализовано решение в моем случае:
project = Project.objects.create(
session=request.session.session_key,
# save all other fields
...
)
if request.user.is_authenticated():
project.user = request.user
else:
# make a copy of the session key
# this is done because the session_key changes
# on login/ register
request.session['key_copy'] = request.session.session_key
project.save()
И в моих models.py:
class Project(models.Model):
user = models.ForeignKey(User, null=True, blank=True)
...
Итак, поле пользователя может быть нулевым, и в этом случае мы используем session_key для отслеживания вещей.