0

互いにリンクされているアプリ オブジェクトと画像オブジェクトがあります (アプリには画像があります)。

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() を使用してみましたが、サポートされていない db クエリを呼び出すため、mysql エラーが返されました。別の方法はありますか?

現在私は持っています:

{% for app in latest_apps_list %}

...{{ app.name }}

{% endfor %}

これは機能します。もちろん、画像の URL は返しません。(私は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")

そして、私の見解は上記の投稿の元の部分にあります。ビューを圧縮する必要なく、アプリのプロパティと画像のプロパティをすべて 1 つのものにする必要があるようです。これは可能ですか?

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 : これで、ビューにはループするオブジェクトが 1 つだけになりました。変な 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))
4

1 に答える 1

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 %}
于 2012-10-02T04:49:19.563 に答える