Попытка создать кортеж из объектов, создать объект и набор запросов - PullRequest
0 голосов
/ 26 июня 2011

Мне нужно перебрать кортеж в шаблоне, но из созданного мной кода я получаю кортеж из объекта (альбома) и набора запросов (фото). Проблема в том, как мне теперь перебрать их в шаблоне?

Модель:

class Album(models.Model):
    title = models.CharField('כותרת', max_length=100, db_index=True)
    created = models.DateTimeField('תאריך פרסום', auto_now_add=True)
    creator = models.ForeignKey(User, related_name='galleries_creator', verbose_name='נכתב ע"י')

class Photo(models.Model):
    title = models.CharField('כותרת', max_length=100)
    album = models.ForeignKey(Album, verbose_name='שייך לאלבום')
    photo = models.ImageField('תמונה', blank=True, upload_to=get_image_path)
    photo_mid = models.ImageField('תמונה בינונית', blank=True, upload_to='images/galleries/mid/', editable=False)
    photo_thumb = models.ImageField('תמונה קטנה', blank=True, upload_to='images/galleries/thumbs/', editable=False)
    created = models.DateTimeField('תאריך פרסום', auto_now_add=True)
    is_landscape = models.NullBooleanField(blank=True, verbose_name='האם תמונת לנדסקייפ', editable=False)

Вид:

def index(request):
    albums = Album.objects.all().order_by('?')[:10]
    album_list = []
    for album in albums:
        album_list.append((album, Photo.objects.filter(album=album).order_by('?')[:1]))
    return render_to_response('galleries/index.html',{'albums':album_list},  context_instance=RequestContext(request))

шаблон:

{% for album, photo in albums %}
    <div class="polaroid" id="picture_{{ forloop.counter }}">
        <img src="{{ MEDIA_URL }}{{ photo.photo }}" alt="Picture #{{ forloop.counter }}" />
        <p class="caption"><p class="title">אלבום {{ forloop.counter }}</p><p>{{ album.creator.first_name }} {{ album.creator.last_name }}</p>
    </div>
{% endfor %}

На мой взгляд, я не могу сделать фото.фото, потому что фотография - это список, а не объект, и я действительно не хочу делать цикл для каждой фотографии в кортеже (есть только одна фотография, так что это просто пустая трата).

assert False album_list возвращает:

[(<Album: אלבום שני - ממשק מנהל>, [<Photo: אלבום 2 תמונה 2>]), (<Album: אלבום ראשון - ממשק מנהל>, [<Photo: אלבום 1 תמונה 7>]), (<Album: אלבום  נתן>, [<Photo: נסיון 4>])]

Что я могу сделать в моем представлении или шаблоне, чтобы решить эту проблему?

Ответы [ 2 ]

3 голосов
/ 26 июня 2011

Если в вашем альбоме есть только одна фотография, то зачем вырезать набор запросов?Просто получите первый, используя индекс:

album_list.append((album, Photo.objects.filter(album=album).order_by('?')[0]))
0 голосов
/ 26 июня 2011

Ну, пока, используя внутренний цикл for, чтобы решить эту проблему, и он, очевидно, работает, но я буду рад услышать о любом другом предложении сделать это более эффективным способом, если это возможно ...

<img src="{% for p in photo %}{{ MEDIA_URL }}{{ p.photo }}{% endfor %}" alt="Picture #{{ forloop.counter }}" />

10x: -)

...