【问题标题】:How can I show only last entry in django?如何在 django 中只显示最后一个条目?
【发布时间】:2013-05-13 10:15:57
【问题描述】:

我正在使用 Django 1.5.1。我的第一页顶部有一个 ImageModel。
如何仅显示此模型的最后一个条目?

#model.py
    class Vitrin(models.Model):
        title = models.CharField(max_length=200)
        image = models.ImageField(upload_to = 'images/vitrin/')
        date_created = models.DateTimeField(auto_now=True)  

#views.py
def index(request):
    categories = Category.objects.all()[:5]
    pages = Page.objects.all()[:5]
    vitrins = Vitrin.objects.all().reverse()[0]
    return render(request, 'gallery/index.html', {'categories': categories, 'pages':pages, 'vitrins': vitrins})   

#index.html
    <div class='vitrin'>
            {% for vitrin in vitrins %}
                <img src="{{ vitrin.image.url|last }}" height="550">
            {% endfor %}
    </div>

但我收到错误:'Vitrin' 对象不可迭代

Request Method: GET
Request URL:    http://localhost:8000/
Django Version: 1.5.1
Exception Type: TypeError
Exception Value:    
'Vitrin' object is not iterable
Exception Location: /usr/local/lib/python2.7/dist-packages/django/template/defaulttags.py in render, line 147

【问题讨论】:

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


    【解决方案1】:

    你也可以实现latest():

    Image.objects.latest()
    Image.objects.latest('attr')  
    

    在模板中

    {{ object_list.latest }}
    

    你可以通过给模型Meta类添加一个属性来实现它:

    class Image(models.Model):
        date_created = models.DateTimeField(auto_now=True)
        # other attrs
    
        class Meta:
            app_label = '<app_name>'
            get_latest_by = 'date_created'
    

    【讨论】:

    • 我已经更新了我的问题,提供了更多详细信息,请检查一下吗?
    • 您正在尝试迭代模板中的单个对象,但这是行不通的。这将返回一个对象:vitrins = Vitrin.objects.all().reverse()[0]。如果您仍想在模板中迭代多个对象,为什么还要首先使用最新的对象?
    • 我只需要最后一个条目 (vitrin.image) 显示在 index.html 页面中,而不是多个项目。我该怎么办?
    • 将{'vintrin': Vintrin.objects.latest()} 传递到您的上下文中并在模板中呈现它{{ vintrin }}
    【解决方案2】:

    查看代码:

    Image.objects.all().reverse()[0]
    

    在模板中:

    {{ images|last }}
    

    更新:

    这应该可行:

    <div class='vitrin'>
        {% with vitrins|last as last %}
            <img src="{{ last.image.url }}" height="550">    
        {% endwith %}    
    </div>
    

    【讨论】:

    • 它对我不起作用,我已经用更多细节更新了我的问题。
    【解决方案3】:

    我试图在我的模板中迭代单个对象,这导致了错误。这将返回一个对象:vitrins = Vitrin.objects.all().reverse()[0]
    我应该将{'vintrin': Vintrin.objects.latest()} 传递到我的上下文中并在模板中呈现它{{ vintrin.image.url }}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多