基于slug请求的ListView
我的网址是:
/tags/{slug}
指向这个视图:
class TagsDetailList(request, ListView):
queryset = Link.objects.filter(tags__name__in=['request.slug'])
template_name = "links/tags_detail_list.html"
所以我在网址中有一个叫做 request.slug 的对象。现在我想做一个列表视图,按照 request.slug 来过滤 Link.objects,并用查询到的结果来响应给指定的模板。
一切都正常,但我的模板中没有显示任何查询结果。
响应的模板是:
{% extends "base.html" %}
{% block content %}
<h2>Tags Detail List</h2>
<ul>
{% if link in object_list %}
{% for link in object_list %}
<li>
<a href="{% url 'tag_detail' slug=link.slug %}">{{ link.title }}</a>
</li>
{% endfor %}
{% else %}
<p> Error: No Links in queryset! </p>
{% endif %}
<ul>
{% endblock %}
我只收到一些错误信息,没有得到任何元素。看起来在我的视图中请求出了问题。谁能帮我,给我个提示,告诉我怎么在我的视图中获取这个请求的 slug?
编辑:
很不错的解决方案。我学到了 kwargs 是怎么工作的(只是了解了一小部分)。但是在模板中我仍然收到没有查询集的错误。我尝试了两个答案,还稍微改了一下,但始终没有真正解决。有什么提示能告诉我这是什么原因吗?
3 个回答
0
也许这对你有帮助,但在Django 2及以上版本中我这样做是有效的:
你的 urls.py
文件:
...
path('tags/<slug>/', TagsDetailList.as_view(), name='tags_detail'),
...
你的 views.py
文件:
...
class TagsDetailList(ListView):
model = Link
template_name = 'links/tags_detail_list.html'
def get_queryset(self, *args, **kwargs):
return Link.objects.filter(tags__slug=self.kwargs['slug'])
...
4
如果你的 urls
模式像这样:
r'^list/(?P<slug>[\w,\*]+)?$'
那么在 views
中应该是:
class TagsDetailList(ListView):
model = Link
template_name = "links/tags_detail_list.html"
def get_queryset(self):
qs = self.model.objects.all()
if self.kwargs.get('slug'):
qs = qs.filter(tags__name=self.kwargs['slug'])
return qs
2
你这里做的事情不太对劲:你只是想要那些名字在“ request.slug”这个字面文本列表中的标签。
你需要重写 get_queryset
方法,这样它才能根据实际的 slug 值进行查询,这个值在 self.kwargs
里面。
def get_queryset(self, *args, **kwargs):
return Link.objects.filter(tags__name=self.kwargs ['slug'])
另外,我不太明白你模板里那个 if 语句在干嘛,但你没有定义“link”,所以它永远不会为真,这样就不会显示任何链接。