从标记库中选择随机项

时间:2012-01-31 10:39:35

标签: django django-templates django-views django-tagging

对随机图像进行Gradding会导致tag.rand_img上的title,url(etc)属性消失,这意味着我无法显示除对象名称之外的任何内容。

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 个答案:

答案 0 :(得分:2)

这一行:

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

返回Queryset,而不是模型实例。查询集没有自定义方法,它们仅存在于该查询集中的实例上。

[:1]替换为[0]以获取实际的模型实例(如果没有匹配的项目,您需要捕获IndexError。)

答案 1 :(得分:1)

我首先得到标签:

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

然后遍历它们并将图像添加为额外字段。然后,您可以执行类似于模板中概述的操作。

答案 2 :(得分: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 %}