【问题标题】:NoReverseMatch get_absolute_url 0 patterns triedNoReverseMatch get_absolute_url 尝试了 0 种模式
【发布时间】:2015-06-09 18:19:12
【问题描述】:

当我转到http://127.0.0.1:8000/books/author/ 时出现错误:

NoReverseMatch 在 /books/author/

“/books/author/1/”用参数“()”和关键字反转 未找到参数“{}”。尝试了 0 个模式:[]

我的视图是 ListView,模板代码如下

<ul>
{% for author in object_list %}
    <li><a href="{% url author.get_absolute_url %}">{{ author.name }} </a></li>
{% endfor %}
</ul>

当我将模板更改为:

<ul>
{% for author in object_list %}
    <li><a href="{% url 'bookstore:author-details' author.pk %}">{{ author.name }} </a></li>
{% endfor %}
</ul>

我的 models.py 包含类 Author 并定义了 get_absolute_url()

class Author(models.Model):
    name = models.CharField(max_length=200)
    birthday = models.DateField()
    photo = models.ImageField(blank=True)
    nickname = models.CharField(max_length=200, blank=True)

    def get_absolute_url(self):
        return reverse('bookstore:author-details', kwargs={'pk': self.pk})

主 urls.py 包含命名空间

urlpatterns = [
    url(r'^books/', include('bookstore.urls', namespace='bookstore')),
]

这里是 bookstore.urls

urlpatterns = [
    url(r'^author/', include([
        url(r'^$', views.AuthorsList.as_view(), name='authors-list'),
        url(r'^create/', views.AuthorCreate.as_view(), name='author-create'),
        url(r'^(?P<pk>[0-9]+)/', include([
            url(r'^$', views.AuthorDetails.as_view(), name='author-details'),
            url(r'edit/', views.AuthorEdit.as_view(), name='author-edit'),
            url(r'delete/', views.AuthorDelete.as_view(), name='author-delete'),
    ]))
    ])),
]

【问题讨论】:

    标签: python django


    【解决方案1】:

    你正在混淆两种方法,即:

    {% url "routing-name" arguments %} https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#url

    reverse("routing-name", [arguments]) https://docs.djangoproject.com/en/1.8/ref/urlresolvers/#reverse

    这两种方法都返回一个字符串,表示某个路由的地址(在您的情况下为“/books/author/1/”)。

    您现在要做的是将reverse() 的结果提供给url 函数。从字面上看,这会导致{% url '/books/author/1/' %}。现在 Django 抱怨路由 '/books/author/1/' 不存在。

    解决方案:{{ author.get_absolute_url }}

    【讨论】:

      【解决方案2】:

      self.pk 是一个整数,你需要有一个字符串。

      改变:

      def get_absolute_url(self):
          return reverse('bookstore:author-details', kwargs={'pk': self.pk})
      

      到:

      def get_absolute_url(self):
          return reverse('bookstore:author-details', kwargs={'pk': str(self.pk)})
      

      也可以使用 args 代替:

      def get_absolute_url(self):
          return reverse('bookstore:author-details', args=[str(self.pk)])
      

      【讨论】:

      • 不,这是错误的。 url-patterns 中的 [0-9]+ 请求一位或多位数字。提供 int 或 string 无关紧要,只要提供一位或多位数字即可。
      • @WouterKleinHeerenbrink,那么 django 文档在他们的文档中有什么 str ? docs.djangoproject.com/en/1.8/ref/models/instances/…
      • 公平点...我不知道...!事实是,将整数转换为字符串不应该也不重要。为了确保我已经在源代码中查看了它,看看会发生什么。我的发现:reverse 转发到_reverse_with_prefix,并且此方法将force_text 应用于所有argskwargsgithub.com/django/django/blob/master/django/core/… 我的结论:您不必自己转换它但仍然:公平点.. 文档建议您应该这样做。
      【解决方案3】:

      Django 1.5+ 需要在 url 模板标签中的方法名两边加上引号

      {% url author.get_absolute_url %}
      

      变成

      {% url 'author.get_absolute_url' %}
      

      【讨论】:

        猜你喜欢
        • 2016-01-31
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 2015-10-15
        • 2020-10-21
        • 1970-01-01
        • 1970-01-01
        • 2023-01-16
        相关资源
        最近更新 更多