基于slug请求的ListView

2 投票
3 回答
3431 浏览
提问于 2025-04-29 17:51

我的网址是:

/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”,所以它永远不会为真,这样就不会显示任何链接。

撰写回答