如何将信息从GET参数传递到Django的POST形式?

问题描述 投票:0回答:1

我有一个邮件列表系统,用户可以在其中单击链接以取消订阅。该链接在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)

这是当方法为GET时在视图中填充user_email的方式:

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版,如果有关系的话。

任何解决方案?这是一个错误吗?

django post django-forms hidden-field disabled-input
1个回答
0
投票
{% if request.user.is_authenticated %} <button id="subscribe" data-url="{% url 'subscribe' %} " data-data={{ request.user.id }} > Subscribe </button> {% endif %} <script> $("#subscribe").on('click', function (){ var url = $(this).getattr('data-url'); var data = $(this).getattr('data-data'); $.ajax({ url: url, type: 'GET', data: { 'target': data }, // this function could be omitted success: function(response) { console.log(response); }); }); </script>

在urls.py中-> urlpatterns:

path('subscribe/', views.subscribe, name="subscribe")

在views.py中:

def subscribe(request):
    if request.method == "GET":
        target_user_id = request.GET.get('target')
        t_user = User.objects.get(id=target_user_id)
         email = t_user.email
         if email:
              t_user.subscribe = True
              return Httpresponse('Done!')

这需要在用户模型中使用布尔字段“订阅”,并且很容易理解。ajax会将布尔值设置为true。小心,它仅适用于已经拥有电子邮件的经过身份验证的用户。

© www.soinside.com 2019 - 2024. All rights reserved.