繁体   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