簡體   English   中英

Django POST 請求為空

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM