[英]Django POST request is empty
运行 Django 4.1.1。 在模板中有以下代码。 通过单击按钮,它会发送数据以删除相应的标记。
<form method="POST">
{% csrf_token %}
<ol>
{% for marker in markers %}
<li>
{{ marker }} - <button class="button btn-primary" id="delete" value="{{ marker.pk }}" type="submit">Delete</button>
</li>
{% endfor %}
</ol>
</form>
在views.py
def user_markers(request):
markers = Marker.objects.filter(owner_id=request.user.id).select_related()
if request.method == "POST":
print(request.POST.get("delete")) # gives me None
marker = Marker.objects.get(pk=request.POST.get("delete"))
marker.delete()
context = {
"markers": markers,
}
return render(request, "hub/markers.html", context)
问题是 request.POST.get("delete") 是空的。 POST 数据只有 'csrfmiddlewaretoken' 我错过了什么吗?
您需要将其指定为名称,因此:
<button class="button btn-primary" id="delete" name="delete" value="{{ marker.pk }}" type="submit">Delete</button>
如果您不指定名称,它将不会包含在 POST 数据中,因此它不会包含通过按钮传递的任何值。
您可能想要改进视图 function:
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, redirect
@login_required
def user_markers(request):
markers = Marker.objects.filter(owner_id=request.user.id).select_related()
if request.method == 'POST':
get_object_or_404(
Marker, owner=request.user, pk=request.POST.get('delete')
).delete()
return redirect() # need to redirect
context = {
'markers': markers,
}
return render(request, 'hub/markers.html', context)
注意:如果 POST 请求成功,您应该进行
redirect
[Django-doc]以实现Post/Redirect/Get模式[wiki] 。 这样可以避免在用户刷新浏览器时发出相同的 POST 请求。
注意:您可以使用
@login_required
装饰器[Django-doc]将视图限制为经过身份验证的用户的视图。
注意:通常最好使用
get_object_or_404(…)
[Django-doc] ,然后直接使用.get(…)
[Django-doc] 。 In case the object does not exists, for example because the user altered the URL themselves, theget_object_or_404(…)
will result in returning a HTTP 404 Not Found response, whereas using.get(…)
will result in a HTTP 500 Server Error .
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.