首页 > 解决方案 > 未找到没有参数的“产品”反向。尝试了 1 种模式:[u'products/(?P[-\\w]+)/$']

问题描述

我正在尝试链接到 Django 管理员中的页面;我正在使用 slugField 这样做。我在包含命名空间的主“urls.py”文件中创建了一个基本 URL。然后我在文件中声明了我的产品 url,该urls.py文件指向我的模板和视图。

索引.html

{% for item in products %}
<div class="col-sm-12 col-md-4 col-lg-4">
  <div class="box">
    {% if item.image_one %}
    <div class="image">
      <img src="{{ item.image_one.url }}" alt="{{ item.name }}">
    </div>
    {% endif %}
    <div class="content">
      <h4>{{ item.name }}</h4>
      <a href="{% url 'products:product' item.slug %}" class="button">View Product</a>
    </div>
  </div>
</div>
{% endfor %}

网址.py

urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^(?P<product>[-\w]+)/$', views.product, name='product'),]

视图.py

def product(request, product):

    product = get_object_or_404(Product, slug=product)

    return render(request, 'products/product.html',{
        'product':product,
})


 def index(request):

     products = Product.objects.all()

     return render(request, 'products/index.html',{
         'products': products,
})

在 index.html 页面上呈现 HTML:

<section id="products">
  <div class="container">
    <div class="row">   
      <div class="col-sm-12 col-md-4 col-lg-4">
        <div class="box">
          <div class="image">
            <img src="/media/temp-image.png" alt="product name">
          </div>
          <div class="content">
            <h4>product name</h4>
            <a href="/products/product-name/" class="button">View Product</a>
          </div>
        </div>
      </div>

      <div class="col-sm-12 col-md-4 col-lg-4">
        <div class="box">
          <div class="image">
            <img src="/media/temp-image_uQcyyVv.png" alt="Another product">
          </div>
          <div class="content">
            <h4>Another product</h4>
            <a href="/products/another-product/" class="button">View Product</a>
          </div>
        </div>
      </div>
    </div>
  </div>
</section>

标签: pythondjango

解决方案


目前尚不清楚为什么 url 反向失败,但您不应该对管理员执行您正在做的事情。相反,将您的更改urls.py为不模仿管理员:

url(r'^(?P<product>[-\w]+)/$', views.product, name='my-product-view')

然后,在您的模板中:

<a href="{% url 'my-product-view' item.slug %}" class="button">View Product</a>

如果这不起作用,请确保您可以reverse手动操作。获取 Django 外壳:

$ python manage.py shell

然后尝试使用您的一个对象中的 id 反转 url:

>>> from django.urlresolver import reverse
>>> aproduct = Product.objects.first()
>>> reverse('my-product-view', args=(aproduct.slug,))

我在上面的 shell 中所做的或多或少是您的{% url %}标签在幕后发生的事情,因此这将使我们对问题所在的位置有所了解。如果这不起作用,则说明您的设置有问题。确认您INSTALLED_APPS包含它所在的应用程序urls.py

最后,您看到的错误似乎表明您在其中一个产品上缺少一个 slug(“对于没有参数的产品反向......”)。通过在 shell 中迭代您的产品来确认不是这种情况:

>>> for p in Products.objects.all():
>>>     if not p.slug: 
>>>         print(p)

推荐阅读