遍历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 %}

这是有效的。当然,它不会返回图像url。(顺便说一句,我用的是sorl缩略图)

更新也许我做这件事的方式不对。以下是我的模型:

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

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

UPDATE 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))

您应该在视图中对它们进行压缩,并将压缩后的对象传递给模板,然后对它们进行迭代。

视图:

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 %}

最新更新