反向网址问题:模板网址出现反向错误

时间:2020-06-21 14:52:48

标签: django django-models django-forms django-views django-templates

我收到此错误找不到'video_detail'的反向参数'('',)'。尝试了1种模式:['video /(?P [-a-zA-Z0-9 _] +)/ $']。请帮忙。

#urls.py

urlpatterns = [
    path('video/<slug:slug>/', views.VideoDetail.as_view(), name='video_detail'),
]

#views.py
class VideoDetail(DetailView):
    model = Video
    template_name = 'video.html'

# index.html
 <a href="{% url 'video_detail' video.slug  %}">

#models.py
class Video(models.Model):
   title = models.CharField(max_length=100, unique=True)
   slug = models.SlugField(max_length=200, unique=True)
   year = models.CharField(max_length=4)
   category = models.CharField(max_length=3)
   genres = models.CharField(max_length=100)
   poster = models.URLField(default='')
   plot = models.CharField(max_length=500)
   trailer = models.URLField(default='')

def __str__(self):
    return self.title

def get_absolute_url(self):
    from django.urls import reverse

    return reverse("video.html", kwargs={"slug": str(self.slug)})

#urls.py主站点

urlpatterns = [
path("admin/", admin.site.urls),
path("", include("accounts.urls")),
path("", include("blog.urls")),
path("", include("video.urls")),
]

#views.py呈现index.html

class HomePage(TemplateView):
template_name = 'index.html'

2 个答案:

答案 0 :(得分:0)

使用-

<a href="{% url 'video_detail' slug=video.slug  %}">

确保video是您正在使用的模型对象,否则它什么也不会给出,并且会出现url错误。

答案 1 :(得分:0)

您已在索引模板<a href="{% url 'video_detail' video.slug %}">中放置了一个链接。但是在HomePage视图中,您不会在任何地方设置video。这意味着video.slug的计算结果为空字符串'',它说明了错误消息的with arguments '('',)'部分。

您可以通过将video.slug更改为要链接的视频的名称来解决此问题,例如

<a href="{% url 'video_detail' 'name-of-title' %}">

如果要在模板中使用video.slug而不是'name-of-title',则需要将video添加到模板上下文中。例如,您可以这样做:

from django.shortcuts import get_object_or_404

class HomePage(TemplateView):
    template_name = 'index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['video'] = get_object_or_404(Video, slug='name-of-title')
        return context

然后在index.html中,您可以执行<a href="{% url 'video_detail' video.slug %}">

或者,您可以将所有个视频添加到模板上下文中。

class HomePage(TemplateView):
    template_name = 'index.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['videos'] = Video.objects.all()
        return context

然后,您可以循环浏览模板中的视频。

{% for video in videos %}
<a href="{% url 'video_detail' video.slug %}">{{ video.title }}</a>
{% endfor %}