2011-06-21 34 views
1

這是一種類似於IMDB的關係:我有一組視頻,並且對於每個視頻,視頻中都有用戶信任。喜歡的東西 -迭代模板中的類別

For Video 1: 
User 1 - Director 
User 2 - Writer 
...etc... 

以下是我的模型 -

class VideoInfo(models.Model): 
    title = models.CharField(max_length=256) 
    uploaded_by = models.ForeignKey('UserProfile') 
    credits = models.ManyToManyField('UserProfile', through='VideoCredit', blank=True, related_name='video_credits') 
... 

class VideoCredit(models.Model): 
    video = models.ForeignKey(VideoInfo) 
    profile = models.ForeignKey('UserProfile', blank=True, null=True) 
    name = models.CharField(max_length=100, blank=True) 
    position = models.ForeignKey(Position) 
    timestamp = models.DateTimeField(auto_now_add=True) 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    ... 

對於給定的用戶,我想通過位置視頻學分分開。喜歡的東西 -

For User A: 

DIRECTOR 
    - Video 1 
    - Video 2 
WRITER 
    - Video 1 
    - Video 3 

...etc... 

我將如何做到這樣的事情在模板 -

{% for position in positions %} 
    <b>{{position}}</b> 
    {% for video in profile.videoinfo_set.filter(position = position) %} # ?? 
     {{video}} 
    {% endfor %} 
{% endfor %} 

或者,有沒有更好的方式來完成我想要做什麼?謝謝。

回答

2

它surpising有多少人不知道regroup

#in view  
credits = profile.videocredit_set.select_related().order_by('position') # will sort by id, but you can sort any way you like 

#in template 
{% regroup credits by position as credits_regrouped %} 
{% for credit in credits_regrouped %} 
<b>{{ credit.grouper }}</b> 
<ul> 
    {% for item in credit.list %} 
    <li>{{ item.video }}</li> 
    {% endfor %} 
</ul> 
{% endfor %} 
1

令您videocredit的位置,並使用{{ifchanged}}模板標籤:

ifchanged

檢查是否值已經從一個循環的最後一次迭代變化。

0

傳入的[(position1, [video1, video2, ...]), (position2,[...])]形式元組的列表 -

list_of_credits =[] 
for position in positions: 
    list_of_videos=[] 
    for video in profile.videocredit_set.filter(position=position): 
     list_of_videos.append(video) 
    list_of_credits.append((position,list_of_videos)) 

{% for item in list_of_credits %} 
    <p><b>{{item.0}}</b></p> 
    {% for video in item.1 %} 
     <p>{{video}}</p> 
    {% endfor %} 
{% endfor %}