2012-01-31 2 views
0

Градирование случайного изображения приводит к тому, что атрибуты title, url (etc) в tag.rand_img исчезают, то есть я не могу отображать ничего больше, чем имя объекта.Выбор случайного элемента из помеченной библиотеки

view.py:

def locations_gallery(request): 
    queryset = Photo.objects.all() 
    tags = Tag.objects.usage_for_queryset(queryset, counts=True) 
    tags.sort(key=operator.attrgetter('count'), reverse=True) 
    for tag in tags: 
    image_tag = Tag.objects.get(name=tag) 
    tag.rand_img = TaggedItem.objects.get_union_by_model(Photo, image_tag).order_by('?')[:1] 
    ctxt['tags'] = tags 
    return render_to_response('locations_gallery.html', ctxt, RequestContext(request)) 

Шаблон (упрощенно):

{% for tag in tags %} 
{{ tag.name }} 
<img src="{{ tag.rand_img.url }}"> 
{% endfor %} 

ответ

2

Эта строка:

tag.rand_img = TaggedItem.objects.get_union_by_model(Photo, image_tag).order_by('?')[:1] 

возвращается в QuerySet, а не экземпляр модели. В запросе нет ваших собственных методов, они существуют только в экземпляре внутри этого набора запросов.

Замените [:1] на номер [0], чтобы получить фактический экземпляр модели (вам нужно поймать IndexError, если нет подходящего предмета).

1

Я бы сначала получить теги:

tags = Tag.objects.usage_for_queryset(queryset, counts=True) 
tags.sort(key=operator.attrgetter('count'), reverse=True) 

, а затем перебирать их и добавить изображение как дополнительное поле. Тогда вы могли бы сделать что-то вроде того, что вы указали в своем шаблоне.

+0

Как вы добавляете изображение в качестве дополнительного поля? Я немного застрял. –

+1

Я думаю, что достаточно просто выполнить 'tag.rand_img = img'. –

+0

tag.rand_img = тег заставляет объект потерять все его атрибуты, такие как title, url и т. Д. –

1

Вы можете добавить атрибуты, подобные этому, Python позволит это, но тогда вы больше не работаете с QuerySet.

Попробуйте это:

def get_rand_img(tag): 
    return TaggedItem.objects.get_union_by_model(Photo, tag).order_by('?')[:1] 

display_tags = [(Tag.objects.get(name=tag), 
       get_rand_img(Tag.objects.get(name=tag))) for tag in tags] 
ctxt['tags'] = display_tags 

Тогда на ваш взгляд

{% for tag, rand_img in tags %} 
    {{ tag.name }} 
    <img src="{{ rand_img.url }}"> 
{% endfor %} 
+0

Тот же результат, я теряю атрибуты: S –

Смежные вопросы