Выбор случайного элемента из библиотеки с тегами - PullRequest
0 голосов
/ 31 января 2012

При сортировке случайного изображения атрибуты title, url (и т. Д.) В 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 %}

Ответы [ 3 ]

2 голосов
/ 31 января 2012

Эта строка:

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

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

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

1 голос
/ 31 января 2012

Вы можете добавить такие атрибуты, 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 %}
1 голос
/ 31 января 2012

Сначала я получу теги:

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

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

...