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_list和都是 Django 模型的不同类的所有对象places_listevents_list

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

选项 2:render在每个类上定义一个方法

这可能更难看,但是您可以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 回答