首页 > 解决方案 > Django将POST删除请求路由到viewProduct?

问题描述

当我尝试在我的 django 应用程序上删除产品时,我收到 404 错误说明:

Page not found (404)
Request Method:     POST
Request URL:    http://localhost:8000/product/1/delete/
Raised by:  products.views.viewProduct

No Product matches the given query.

我对为什么 Django 将删除请求路由到 viewProduct 感到困惑,因为我的 urls.py 明确指出它应该路由到 deleteProduct。

网址.py:

from django.urls import path
from . import views
from django.views.generic import TemplateView

urlpatterns = [

    path('new/', views.NewProduct, name='NewProduct'),
    path('product/<int:pk>/<str:slug>/', views.viewProduct, name='viewProduct'),
    path('product/<int:pk>/delete/', views.deleteProduct, name='deleteProduct'),

]

意见:

from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse
from .models import Product
from django.utils import timezone
from slugify import slugify


def viewProduct(request, pk, slug):
    product = get_object_or_404(Product, pk = pk, slug = slug)
    return render(request, 'viewProduct.html', {'product' : product})


def deleteProduct(request, pk):
    if request.method == 'GET':
        product = Product.objects.filter(pk = pk)   
        return redirect('viewProduct', pk = pk, slug = product.slug)
    if request.method == 'POST':
        product = get_object_or_404(Product, pk = pk)
        if product.productAuthor == request.user:
            product.delete()
    return redirect('viewAll')

删除形式:

{% if request.user == product.productAuthor %}
    <form action="/product/{{ product.pk }}/delete/" method="post">
        {% csrf_token %}
        <input type="submit" name="pk" class="btn btn-link text-danger" value="delete product">
    </form>
{% endif %}

如果它对您有帮助,我最近将网站更改为按 ID 和 slug 而不是仅 ID 查看帖子。在我更改此设置之前,删除功能运行良好。

标签: pythondjango

解决方案


也许这是你删除后缩进的方式,试试这个

我看不到您要重定向的 viewAll url 处理程序,您需要编写一个 viewAll 视图来列出所有产品

from django.urls import reverse


urlpatterns = [
    path('',views.ViewAll, name='viewAll')
    path('new/', views.NewProduct, name='NewProduct'),
    path('product/<int:pk>/<str:slug>/', views.viewProduct, name='viewProduct'),
    path('product/<int:pk>/delete/', views.deleteProduct, name='deleteProduct'),

]


def deleteProduct(request, pk):
    if request.method == 'GET':
        product = Product.objects.filter(pk = pk)   
        return redirect('viewProduct', pk = pk, slug = product.slug)
    if request.method == 'POST':
        product = get_object_or_404(Product, pk = pk)
        if product.productAuthor == request.user:
            product.delete()
            return redirect(reverse('yourappname:viewAll'))

推荐阅读