Skip to main content
 首页 » 编程设计

python之get_absolute_url 的 Django NoReverseMatch 问题

2025年05月04日28kerrycode

我知道这可能是 Django 最常见的问题,但我终究无法解决这个问题。我会尽快完成。

# urls.py 
urlpatterns += [ 
    path('certs/', views.certs, name='certs'), 
    path('certs/<int:id>/', views.view_cert, name='view_cert'), 
] 

-

# views.py 
@login_required 
def certs(request): 
    certs = Certification.objects.filter(user=request.user) 
    return render(request, 'certs.html', {'certs': certs}) 
 
 
def view_cert(request, id): 
    cert = Certification.objects.get(id=id) 
    return render(request, 'view_cert.html', {'cert': cert}) 

-

# certs.html 
{% if certs %} 
    <ul class="list-group"> 
    {% for cert in certs %} 
        <li class="list-group-item">{{ cert.name }}</li> 
        <!--<a href="{% url cert.get_absolute_url %}" class="list-group-item list-group-item-action">{{ cert.name }}</a>--> 
    {% endfor %} 
    </ul> 
{% endif %} 

-

# models.py 
class Certification(models.Model): 
... 
def get_absolute_url(self): 
    return reverse('crypto:view_cert', kwargs={'id': self.id}) 

例如,当我加载/certs/1 时,代码工作得非常好。但是,当我尝试加载/certs(应该列出用户证书)时,我得到了一个 NoReverseMatch。

Reverse for '/certs/1/' not found. '/certs/1/' is not a valid view function or pattern name. 

更令人困惑的是我可以从 shell 加载它:

>>> from django.urls import reverse 
>>> reverse('crypto:view_cert', kwargs={'id': 1}) 
'/certs/1/' 
>>> 

有人有什么想法吗?

请您参考如下方法:

因为 get_absolute_url 的结果是 url 字符串,你不需要在模板中使用 {% url %} 来使用它。只需将其替换为:

<a href="{{ cert.get_absolute_url }}" class="list-group-item list-group-item-action">{{ cert.name }}</a>