Способ передачи информации из параметра GET в форму POST в django? - PullRequest
0 голосов
/ 20 февраля 2020

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

Я пытался добиться этого следующим образом:

  1. взять письмо из параметра GET
  2. положить его как значение initial в скрытом поле в форме обратной связи
  3. получить его из данных формы при отправке формы

Проблема заключается в том, что если это скрытое поле не отключен, пользователь может вмешиваться в его значение и уничтожать свою личность или даже утверждать, что обратная связь пришла от другого пользователя. Но если я установил поле как отключенное, словарь request.POST вообще не будет содержать поле.
Я также пытался оставить поле включенным и проверять его наличие в form.changed_data, но, похоже, оно всегда присутствует там. даже если его значение не меняется.

Это класс формы:

class UnsubscribeForm(forms.Form):
    reason = forms.ChoiceField(choices=UnsubscribeFeedback.Reasons.choices)
    comment = forms.CharField(widget=forms.Textarea, required=False)
    user_email = forms.CharField(widget=forms.HiddenInput, required=False, disabled=False)

Вот как я заполняю user_email в представлении, когда метод GET:

email = request.GET.get("email", "")
# ...
context["form"] = UnsubscribeForm(initial={"user_email": email})

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

И вот как я проверяю значение в POST-части представления при получении формы с привязкой к данным:

form = UnsubscribeForm(request.POST)

if form.is_valid():  # This passes whether I change the value or not.
    if "user_email" in form.changed_data:  # This too passes whether I change the value or not.
        print("Changed!")

    email = form.cleaned_data["user_email"]  # This is "" if user_email is disabled, else the correct value.

Понятия не имею, почему заданное мной начальное значение игнорируется, когда поле отключено. Насколько я знаю, отключенное поле передает начальное значение независимо от каких-либо изменений, но здесь начальное значение не передается вообще. И, как я уже говорил выше, я не могу позволить пользователю редактировать это поле, даже если оно скрыто.

Django - это версия 3.0.3, если это имеет значение.

Любое решение? Это ошибка?

1 Ответ

0 голосов
/ 21 февраля 2020

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

В Исходный вопрос, я совершенно не учел указать (чтобы сделать код минимальным и воспроизводимым), что запрос GET, который включает адрес электронной почты пользователя, также содержит токен, который я генерирую с непредсказуемыми данными, чтобы убедиться, что электронная почта является authenti c и соответствует подписанному пользователю. Чтобы успешно вмешиваться в электронную почту, пользователь также должен был создать поддельный токен, что маловероятно (и не стоит усилий), если у него нет доступа как к моей базе данных, так и к базе кода (в этом случае у меня проблемы хуже, чем Форма обратной связи).

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

...