У меня есть система списков рассылки, в которой пользователь может щелкнуть ссылку, чтобы отписаться. Эта ссылка содержит адрес электронной почты пользователя в параметре GET и страницу, на которую он указывает, содержит краткую форму для запроса обратной связи. Этот отзыв должен указывать на адрес электронной почты пользователя, который его отправил.
Я пытался добиться этого следующим образом:
- взять письмо из параметра GET
- положить его как значение
initial
в скрытом поле в форме обратной связи - получить его из данных формы при отправке формы
Проблема заключается в том, что если это скрытое поле не отключен, пользователь может вмешиваться в его значение и уничтожать свою личность или даже утверждать, что обратная связь пришла от другого пользователя. Но если я установил поле как отключенное, словарь 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, если это имеет значение.
Любое решение? Это ошибка?