[英]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.