首页 > 解决方案 > 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 }}

标签: pythondjango

解决方案


您应该尝试理解错误:

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.

推荐阅读