python - 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 查看帖子。在我更改此设置之前,删除功能运行良好。
解决方案
也许这是你删除后缩进的方式,试试这个
我看不到您要重定向的 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'))
推荐阅读
- java - 杰克逊连载一对多关系
- c# - Failure to create a SqlDataSourceEnumerator
- c# - Serilog 模板和 Microsoft.Extensions.Logging
- cmd - 查找和替换字符串的批处理命令
- java - 如何使用 Selenium Java 处理 https://www.spicejet.com/ 的 PASSENGERS 字段的静态下拉列表
- .net - 使用错误的文件扩展名重定向 URL
- javascript - 从 adal-node 承诺 acquireTokenWithClientCredentials 函数
- python - 在使用 xml ElementTree 时,我随机得到 IOError
- apache-spark - 在不更改列名的情况下创建 PySpark 数据框
- macos - brew install "formula" 出现 SHA256 校验和不匹配错误