Перебрать категорию в шаблоне - PullRequest
1 голос
/ 21 июня 2011

Это отношение, подобное 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 %}

Или есть ли лучший способ выполнить то, что я пытаюсь сделать?Спасибо.

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Удивительно, сколько людей не знают о перегруппировке .

#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 голос
/ 21 июня 2011

Закажите ваш видеокредит по позиции и используйте шаблонный тег {{ifchanged}}:

ifchanged

Проверить, изменилось ли значение с последней итерации цикла.

0 голосов
/ 21 июня 2011

Передайте список кортежей в виде [(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 %}
...