循环遍历Django模板中的两个对象

时间:2012-10-02 03:26:08

标签: python django

我有一个相互链接的应用对象和图像对象(应用有图像)。

def index(request):
    latest_apps_list = App.objects.all().exclude(approved=False).order_by('name')[:20]
    app_images = Image.objects.filter(app__in=latest_apps_list).order_by('app__name')[:20]
    t = loader.get_template('apps/index.html')
    c = Context({
        'latest_apps_list': latest_apps_list,
        'app_images': app_images
    })
    return HttpResponse(t.render(c))

现在我想在模板中循环浏览这些图像。我如何用两个变量做到这一点?我尝试使用zip(),但这会返回mysql错误,因为它调用了不支持的数据库查询。还有另一种方式吗?

目前我有:

{% for app in latest_apps_list %}

...{{ app.name }}

{% endfor %}

这很有效。当然,它不会返回图像网址。 (我正在使用sorl-thumbnail btw。)

更新也许我只是想以错误的方式做这件事。以下是我的模型的方法:

class App(models.Model):
    name = models.CharField(max_length=200)
    # ...

class Image(models.Model):
   app = models.ForeignKey(App)
   image = models.ImageField(upload_to = "apps")

我的视图位于上面帖子的原始部分。看起来我应该以某种方式将应用程序的属性和图像属性放在一起,而不需要在视图中压缩。这可能吗?

更新2 我通过大大简化模型的创建方式解决了这个问题。这是我做过的事,以防其他人试图这样做。

apps / admin.py :图片对象包含在普通字段中。

class AppAdmin(admin.ModelAdmin):
   fieldsets = [
      ('Basic', {'fields':['name','desc','price','approved','image']}),
      ('Author',        {'fields':['docs_url', 'preview_url']}),
   ]
   list_display = ('name', 'desc', 'price', 'approved')


admin.site.register(App, AppAdmin)

apps / models.py :只需将图片作为应用本身的一部分。不需要外键。

class App(models.Model):
    name = models.CharField(max_length=200)
    # ...
    image = models.ImageField(upload_to = "apps")

apps / views.py :现在视图只有一个要循环的对象。不需要奇怪的SQL查询。

def index(request):
    latest_apps_list = App.objects.all().exclude(approved=False).order_by('name')[:20]
    t = loader.get_template('apps/index.html')
    c = Context({
        'latest_apps_list': latest_apps_list,
    })
    return HttpResponse(t.render(c))

1 个答案:

答案 0 :(得分:3)

你应该在视图中压缩它们,并将该压缩对象传递给模板,然后遍历它们。

视图:

def index(request):
    latest_apps_list = list(App.objects.all().exclude(approved=False).order_by('name')[:20])
    app_images = Image.objects.filter(app__in=latest_apps_list).order_by('app__name')[:20]
    t = loader.get_template('apps/index.html')
    c = Context({
        'zipped_app_list': zip(latest_apps_list, list(app_images))
    })
    return HttpResponse(t.render(c))

模板:

{% for app, image in zipped_app_list %}
    {{ app }}
    {{ image}}
{% endfor %}