在模板中使用Django链如何?

时间:2012-04-22 18:04:31

标签: database django templates

我使用了链:

在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>
提前谢谢。

2 个答案:

答案 0 :(得分:3)

我需要更多地了解正确回答您的问题,但这里有一些可能对您有帮助的想法。我假设photos_listplaces_listevents_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 %}

选项2:在每个课程中定义render方法

这可能更加丑陋,但您可以在每个对象上定义一个render方法,该方法返回您要为该对象吐出的完整HTML。然后就是在模板中执行此操作的情况:

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

旁注:考虑继承

听起来像照片,地点和事件都可能出现在同一个Feed中,因此它们可能会共享一些常见字段(例如posted_at)。关于此,您需要考虑各种各样的事情,因此最好查看Django documentation on model inheritance

答案 1 :(得分: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 %}