Подтвердить что ты не робот

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 (временная метка, связанная со случайным хешем?), а затем сохранить это имя пользователя в данных сеанса. Если я гарантирую, что эта переменная сеанса, если она существует, используется для записи активности всех проектов этого пользователя, я должен иметь возможность обновлять проекты с помощью реальных учетных данных пользователя при их регистрации.

Является ли это чрезмерно сложным и хрупким? Не могу ли я экономить тысячи строк данных без необходимости? Каким будет оптимальный подход для этой общей проблемы?

Любые рекомендации по этому вопросу будут высоко оценены.

4b9b3361

Ответ 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 для отслеживания вещей.