我使用了链:
在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>
提前谢谢。
答案 0 :(得分:3)
我需要更多地了解正确回答您的问题,但这里有一些可能对您有帮助的想法。我假设photos_list
,places_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 %}
选项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 %}