2012-04-22 116 views
1

我使用的链为:在模板中使用Django链如何?

在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> 

在此先感谢。

回答

3

我需要多了解一些才能正确回答你的问题,但这里有一些想法可以帮助你。我假设photos_list,places_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 %} 

旁注:考虑继承

这听起来像的照片,地点和事件都可能出现在相同的饲料所有的东西,正因为如此他们可能会共享一些常用字段(如posted_at)。有很多事情你需要考虑到这一点,所以最好看看Django documentation on model inheritance

+0

您好,感谢您的重播,对不起忘了提及“照片,事件,地点”是不同的车型 – Hamza 2012-04-22 19:05:00

+0

我的答案假设他们是不同的模型,所以这很好。 – 2012-04-22 19:33:43

+0

工作,他们都尝试了所有谢谢你:D – Hamza 2012-04-22 20:05:55

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 %} 
+0

谢谢,我第一次尝试代理...:D – Hamza 2012-04-22 20:06:27

+0

我不认为你需要让他们的属性,实际上。如果是方法,模板引擎将调用该方法。 – tobych 2012-12-31 04:31:39

+0

@Toby。凉。这很好。 :) – 2012-12-31 08:23:36