【问题标题】:ForeignKey and Django TemplateForeignKey 和 Django 模板
【发布时间】:2009-08-15 17:24:32
【问题描述】:

所以这就是问题所在。想象 2 个模型:摄影师和照片。严格的规则是图像只能有 1 位摄影师,因此在 Photo 中有一个指向摄影师的 ForeignKey 链接。


class Photographer(models.Model):
    name = models.CharField(max_length = 40)

class Photo(models.Model):
    name = models.CharField(max_length = 40)
    photographer = models.ForeignKey(Photographer)

现在我想在主页上展示最著名的摄影师,其中包含 3 张最受欢迎的照片。所以应该是这样的:


# views.py
def main(request):
    photographers = ...
    return render_to_response("main_page.html", {
                "photographers": photographers
           })

#main_page.html
{% for photo in photographers.photo_set.all()[:3] %}
{{ photo.name }}
{% endfor %}

但是 Django 模板系统不允许 all() 和 [:3]。那么最好的方法是什么?最明显的解决方案是动态创建对象(从摄影师和照片创建数组并将其传递给模板),但我认为这不是一个好方法。

请不要只参考 Django 手册,我仔细阅读了它,但找不到答案...

【问题讨论】:

  • 我刚刚添加了一个答案,实际上或多或少是您在评论中所说的:-)

标签: django templates collections


【解决方案1】:

尝试使用slice filter

{% for photo in photographers.photo_set.all|slice:":3" %}

请注意,.all 不需要显式调用。

【讨论】:

  • 那行得通,太棒了!实际上我自己找到了一种更通用的方法:向Photographer get_top3photos(self) 添加一个方法,它只返回self。 photo_set.all()[:3] 并添加一个属性 top_3_photos = property(get_top3photos) 所以在模板中我可以参考这个新属性 {% for photo in Photographer.top_3_photos %}
  • 是的,将选择移出模板是您的最佳选择。将其放入视图或模板标签中。
【解决方案2】:

我认为 Yuval A 几乎明白了,但不完全是 - 照片和摄影师似乎混淆了。我认为最好的方法是在 Photographer 模型上提供一个 top_photos 属性,该属性返回前 3 张(或许多)照片。那么:

{% 摄影师中的摄影师 %} 摄影师:{%摄影师.name %} 热门照片: {% for photo in摄影师.top_photos %} {% photo.name} {% endfor %} {% endfor %}

我在上面省略了任何 HTML 格式,但希望意图是明确的。

【讨论】:

    【解决方案3】:

    你明白了,你只需要将逻辑移动到视图中,然后在获得对象后将对象传递给模板。

    # views.py
    def main(request):
        photographers = photographers.photo_set.all()[:3]
        return render_to_response("main_page.html", {
                    "photographers": photographers
               })
    
    #main_page.html
    {% for photo in photographers %}
    {{ photo.name }}
    {% endfor %}
    

    确保您的视图包含逻辑并且模板只显示数据。

    【讨论】:

    • 是的,但我还需要在页面上显示摄影师的名字......所以它会像“摄影师 John Rain,照片:照片 1、照片 2、照片 3”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2013-10-21
    • 2019-04-30
    相关资源
    最近更新 更多