我知道这可能是 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>
