【问题标题】:Reverse for 'product' with no arguments not found. 1 pattern(s) tried: [u'products/(?P<product>[-\\w]+)/$']未找到没有参数的“产品”反向。尝试了 1 种模式:[u'products/(?P<product>[-\\w]+)/$']
【发布时间】:2019-12-17 20:57:13
【问题描述】:

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

index.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 %}

urls.py

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

views.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>

【问题讨论】:

  • 您的其中一款产品似乎缺少一个蛞蝓。请发布 a) 您的 index 视图和 b) 检查元素并在索引页面上发布呈现的 html。
  • @BrianDant 请查看编辑
  • 我编辑了你的帖子。你能重新阅读它以确保我们在同一页上吗?我注意到您帖子标题中的正则表达式与您的urls.py 中的不匹配。 [-\\w]} 与 [-\w]。无论如何,如果您试图拦截通常会发送给管理员的请求,正如我在顶部附近的编辑中所写,我们应该考虑更改它。有更好的方法来做到这一点。
  • 是的,我们在同一页面上。我注意到 URL 模式的不同,但即使我改变了这个,也没有任何改变。
  • 我几乎尝试了所有方法,所以欢迎您提出任何建议

标签: python django


【解决方案1】:

目前尚不清楚 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 shell:

$ 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(“reverse for product with no arguments ...”)。通过在 shell 中迭代您的产品来确认不是这种情况:

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

【讨论】:

  • Shell 工作正常,我可以确认应用已添加到 INSTALLED_APPS
  • 您是否更改了视图的名称?
  • 将您的 shell 会话复制到您的问题中。
【解决方案2】:

感谢您的帮助。原来我在我试图打开的文档的其他地方引用了没有 slug 周边的 URL 字符串,因此它导致了错误。

感谢帮助和支持

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多