1

私はチェーンを次のように使用しました:

views.pyで

places_list = Place.objects.all().order_by('-datetimecreated')[:5]
events_list = Event.objects.all().order_by('-datetimecreated')[:5]
photos_list = Photo.objects.all().order_by('-datetimecreated')[:5]
result_list = list(chain(photos_list, places_list, events_list))

テンプレートファイル内

    {% for item in result_list %}

        <a href="{% url view_place item.slug %}">{{item.title}}</a>

    {% endfor %}

それは場所を表示することですが、イベントや写真を表示する方法は?

        <a href="{% url view_event item.slug %}">{{item.title}}</a>
        <a href="{% url view_photo item.slug %}">{{item.caption}}</a>

前もって感謝します 。

4

2 に答える 2

4

あなたの質問に適切に答えるにはもう少し知る必要がありますが、ここに役立つアイデアがいくつかあります。photos_listplaces_listおよびevents_listはすべて、Django モデルである異なるクラスのオブジェクトであると仮定しています。

オプション 1: オブジェクトのタイプを判別するメソッドを各クラスに定義する

たとえばcontent_type、次のように各モデルでメソッドを定義します。

class Photo(models.Model):
    def type(self):
        return 'photo'

次に、テンプレートでこれを確認します。

{% for item in result_list %}
    {% if item.type == "photo" %}
        ...
    {% elif item.type == "place" %}
        ...
    {% else %}
        ...
    {% end %}
{% endfor %}

renderオプション 2:各クラスでメソッドを定義する

renderこれはおそらくかなり醜いですが、各オブジェクトに対して、そのオブジェクトに対して吐き出したい完全な HTML を返すメソッドを定義することができます。次に、テンプレートでこれを行う場合です。

{% for item in result_list %}
    {{ item.render }}
{% endfor %}

補足: 継承を考慮する

写真、場所、イベントはすべて同じフィードに表示される可能性があるため、いくつかの共通フィールド ( などposted_at) を共有する可能性があるようです。これに関しては、さまざまな考慮事項があるため、モデルの継承に関する Django のドキュメントを参照することをお勧めします。

于 2012-04-22T18:23:48.240 に答える
2

テンプレートで使用できる各モデルの「プロキシ」プロパティを定義できます。次のようなことを考えてみましょう:

class Photo(models.Model):
    ... # fields etc.

    @property
    def url(self):
        ... # return reversed url now

    @property
    def caption(self):
        ... # same idea, access title/whatnot

テンプレートでは、次のようになります。

{% for item in item_list %}
    <a href="{{ item.url }}">{{ item.caption }}</a>
{% endfor %}
于 2012-04-22T19:00:40.340 に答える