2012-04-22 72 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