Django - 如何从模板中的查询集中获取最后一项

Posted

技术标签:

【中文标题】Django - 如何从模板中的查询集中获取最后一项【英文标题】:Django - how get last item from queryset in template 【发布时间】:2020-09-12 14:00:48 【问题描述】:

我是 Django 的初学者,不能做一些非常基本的事情;链接到数据库中的最后一个(或第一个)项目。

首先是我正在使用的模型:

class Artwork(models.Model):
    date = models.DateField(auto_now_add=True)
    art = models.ImageField(upload_to='artworks/%Y')
    title = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)
    herochoices = [('left', 'left'), ('middle', 'middle'), ('right', 'right')]
    hero = models.CharField(choices=herochoices, max_length=6, null=True, blank=True, unique=True, error_messages='unique':'Another artwork already uses this hero position.')  
    slug = slugify(title, allow_unicode=False)

    def __str__(self):
        return self.title

    def get_absolute_urls(self):
        return reverse('artwork_list', kwargs='slug': self.slug)

我在视图中创建了以下查询集:

class ArtworkDetailView(DetailView):
    model = Artwork
    template_name = 'artwork_detail.html'
    qs = Artwork.objects.all()

现在在我的模板中,我试图提供指向查询集中最后一项的链接。但是我不知道用什么来填充 href 属性以提供这样的链接:

% extends 'base.html' %

% block content %

    <h1> artwork.title|title</h1>
    <div class="row">

        <div class="col-sm-1 float-left">
            <p class="arrows">
                % if artwork.get_previous_by_date.id == '' %
                        <a href=" ????? ">
                % else %
                    <a href="/artwork/ artwork.get_previous_by_date.id / artwork.get_previous_by_date.title /">
                % endif %
                    <span class="material-icons" style="font-size: 30pt">keyboard_arrow_left</span>
                </a>
            </p>
        </div>

我已经通过在其中输入https://www.google.com 的 URL 来测试 if 条件可以正常工作。我的问题确实是将查询集中最后一项的绝对网址放入我的模板中。

谢谢,

乔恩

【问题讨论】:

【参考方案1】:

您可以通过覆盖get_object 方法获得.latest(…).last()

class ArtworkDetailView(DetailView):
    model = Artwork
    template_name = 'artwork_detail.html'

    def get_object(self, queryet=None):
        if queryset is None:
            queryset = self.get_queryset()
        return queryset.latest('date')

或者你可以使用专门的方法:

class ArtworkDetailView(DetailView):
    model = Artwork
    template_name = 'artwork_detail.html'

    def latest_artwork(self):
        return Artwork.objects.latest('date')

并在视图中渲染它:

&lt;a href=" <b>view.latest_artwork.get_absolute_url</b> "&gt;

请注意,您在模型中打错字了,它是get_absolute_url,而不是get_absolute_urls

【讨论】:

您好,Willem,非常感谢您,第二个解决方案非常有效。我稍微修改了 href 值,因为我目前遇到了 slug 无法正常工作的问题,但我会再次修复它。非常感谢您提供干净的解决方案并指出我模型中的错字。

以上是关于Django - 如何从模板中的查询集中获取最后一项的主要内容,如果未能解决你的问题,请参考以下文章

Django如何在查询集中标记用户特定的对象以发送到模板?

django模板变量从查询集中构建表的字段数

Django:如何从与用户相关的子查询集中获取不同的父列表?

Django模板中查询集中的循环内循环

如何比较 Django 模板中的两个查询集?

从 django 的查询集中获取第一个对象的最快方法?