【问题标题】:Choosing a random item from a tagged library从标记的库中选择一个随机项目
【发布时间】:2012-01-31 10:39:35
【问题描述】:

对随机图像进行分级会导致 tag.rand_img 上的标题、url(等)属性消失,这意味着我只能显示对象名称。

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 %}

【问题讨论】:

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


    【解决方案1】:

    这一行:

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

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

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

    【讨论】:

      【解决方案2】:

      我会先得到标签:

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

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

      【讨论】:

      • 如何将图像添加为额外字段?这就是我坚持的一点。
      • 我认为只需做一个tag.rand_img = img 就足够了。
      • tag.rand_img = tag 导致对象失去其所有属性,如标题、url 等
      • 不对...Python doc 说您可以稍后在课程中添加一个字段。 ...它应该是 "... = img" ,而不是 "... = tag" :)
      • 谢谢,那只是一个错字。我认为 TaggedItem.objects.get_union_by_model(Photo, image_tag).order_by('?')[:1] 行正在删除我需要的额外属性。我会更新上面的代码。
      【解决方案3】:

      您可以添加这样的属性,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 %}
      

      【讨论】:

      • 同样的结果,我失去了属性:S
      猜你喜欢
      • 2011-02-28
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多