我有一个邮件列表系统,用户可以在其中单击链接以取消订阅。该链接在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)
这是当方法为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版,如果有关系的话。
任何解决方案?这是一个错误吗?
{% 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。小心,它仅适用于已经拥有电子邮件的经过身份验证的用户。