python - NoReverseMatch Django 2 Python
问题描述
NoReverseMatch 未找到未找到参数的“Edit_Product”的反向。尝试了 1 种模式:['shop/product/Edit_Product/(?P[0-9]+)$']
我不明白这个错误背后的原因我试图在网上寻找答案但到目前为止对我没有任何帮助
模型.py
class Product(models.Model):
category = models.ForeignKey(Category,
related_name='products',
on_delete=models.CASCADE)
name = models.CharField(max_length=200, db_index=True)
slug = models.SlugField(max_length=200, db_index=True)
image = models.ImageField(upload_to='products/%Y/%m/%d',
blank=True)
description = models.TextField(blank=True)
price = models.DecimalField(max_digits=10, decimal_places=2)
available = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
ordering = ('name',)
index_together = (('id', 'slug'),)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('shop:product_detail', args=[self.id, self.slug])
表格.py
class EditProduct(forms.ModelForm):
class Meta:
model = Product
fields = ["category", "name", "image", "description",
"price", "available"]
视图.py
@staff_member_required
def Edit_Product(request, id=None):
product = get_object_or_404(Product, id=id)
if request.method == "POST":
form = EditProduct(request.POST, instance=product)
if form.is_valid():
form = form.save(commit=False)
form.save()
return render(request, 'shop/product/Edit_Product.html', {'product': product, 'form':form})
else:
form = EditProduct(instance=product)
return render(request,'shop/product/Edit_Product.html', {'form': form})
网址.py
urlpatterns = [
path('', views.product_list, name='product_list'),
path('<slug:category_slug>/', views.product_list, name='product_list_by_category'),
path('<int:id>/<slug:slug>/', views.product_detail, name='product_detail'),
path('shop/Create_Product/', views.Create_Product, name='Create_Product'),
path('shop/product/Edit_Product/<int:id>', views.Edit_Product, name='Edit_Product'),
]
模板看起来像这样
{% extends "shop/base.html" %}
{% load static %}
<title> Edit </title>
{% block content %}
<div>
<form action="{% url 'shop:Edit_Product' id=Product.id %}" method="POST" enctype="multipart/form-data">
{{ form.as_p }}
<p><input type="submit" value="Update"></p>
{% csrf_token %}
</form>
</div>
{% endblock %}
我非常感谢我几天来一直在获得的任何帮助,并且在修改它时我收到此错误或 404 错误。
错误显示浏览器中的 detailproduct 视图我尝试安排他们在它之前进行编辑并将其添加到渲染行但也没有运气这就是编辑后 view.py 产品详细信息的样子
def product_detail(request, id, slug):
product = get_object_or_404(Product,
id=id,
slug=slug,
available=True)
cart_product_form = CartAddProductForm()
return render(request,
'shop/product/detail.html',
{'product': product,
'cart_product_form': cart_product_form})
错误的图像链接在这里,请在此处 输入图像描述
细节.html
{% block content %}
<div class="product-detail">
<img src="{% if product.image %}{{ product.image.url }}{% else %}{% static "img/no_image.png" %}{% endif %}">
<h1>{{ product.name }}</h1>
<h2><a href="{{ product.category.get_absolute_url }}">{{ product.category }}</a></h2>
<p class="price">${{ product.price }}</p>
<form action="{% url "cart:cart_add" product.id %}" method="post">
{{ cart_product_form }}
{% csrf_token %}
{% if request.user.is_staff %}
<a href="{% url "shop:Edit_Product" %}">Edit Product </a>
{% endif %}
<input type="submit" value="Add to cart">
</form>
{{ product.description|linebreaks }}
解决方案
您应该尝试理解错误:
NoReverseMatch 未找到未找到参数的“Edit_Product”的反向。
这个错误是说你要求 Django用name反转一个 url 模式,它需要一个参数但没有给出参数。 Edit_Product
事实上,这是你的道路:
path('shop/product/Edit_Product/<int:id>', views.Edit_Product, name='Edit_Product')
所以为了扭转它,你需要将参数传递给它id
:
# in a view
from django.urls import reverse
reverse('Edit_Product', kwargs={'id': <some_id>})
# in a template
{% url 'Edit_Product' id=<some_id> %}
您现在可以像这样在整个项目中搜索reverse('Edit_Product'
和{% url 'Edit_Product'
/或缩小范围:
- 首先,这不是您的Edit_Product视图中的错误(至少不一定),它可能发生在任何反转 url 模式的视图中。您需要查看错误消息的其余部分,它会告诉您请求了哪个 url 或使用了哪个视图。
- 您已经看到这实际上是在
product_detail()
视图中,在render()
方法中发生的。 - 所以在渲染模板时触发了错误,在本例中是detail.html模板。在这里你应该检查
{% url 'Edit_Product' ... %}
. - 你有它,
{% url 'Edit_Product' %}
没有争论。通过添加product.id
.
推荐阅读
- sql - 如何计算 Oracle 表中的 YTD(年初至今)值
- mysql - 如何在 mysql 工作台中更新 mysqldump.exe
- angular - 如何减小 MatSelect DropDown Panel 的大小
- amazon-s3 - 容器中带有 s3 对象挂载的 kubernetes pod
- docker - 基于busybox的docker镜像添加Linux实用程序
- swift - 如何通过 Swift 中的函数传递字典键以返回一个数组值
- javascript - 有没有办法将数据从我的 client.js 传递给我的 server.js,因为它返回多个数据取决于客户端访问我的网站
- docker - gitlab kaniko - 没有找到匹配的凭据,依靠匿名
- reactjs - npm 没有安装
- react-native - 类型字符串属性列表中的 React Native Realm 过滤器项