【问题标题】:Get a random object from a list of objects with template使用模板从对象列表中获取随机对象
【发布时间】:2017-05-13 19:31:22
【问题描述】:

我在另一个模型的每个图标下列出了我在模型数据库中拥有的所有字体。

我想为每个图标获得一种随机字体。

这是我显示模板文件的方式:

{% for Fo in FormOne %}
    {% for Ft in FormTwo %}
        {% for f in Ft.icon.all %}          
            <p>{{ f.icon_name }}</p>        #for each icon name
            {% for f in Fo.checkbox.all %}
                <p>{{ f.font_name }}</p>    #show one random font name.
            {% endfor %}
        {% endfor %}
    {% endfor %}
{% endfor %}

我的观点是这样的:

context = {'FormOne':FormOne.objects.all(), 'FormTwo':FormTwo.objects.all()}

这是我的模型结构:

class Font(models.Model):
    font_name = models.CharField(max_length=100)
    font_css = models.CharField(max_length=100)

class FormOne(models.Model):
    name = models.CharField(max_length=40)
    checkbox = models.ManyToManyField(Font, blank=True)
    ...

class Icons(models.Model):
    icon_name = models.CharField(max_length=100)
    ...

class FormTwo(models.Model):
    owner = models.ForeignKey(FormOne)
    icon = models.ManyToManyField(Icons, blank=True)
    ...

我怎样才能实现它?

【问题讨论】:

  • 使用random 内置过滤器。见docs

标签: python django django-templates


【解决方案1】:

你可以使用custom filters

这是一个从列表中选择随机元素的过滤器:

import random
from django import template

register = template.Library()

@register.filter('random_font', random_font)
def random_font(l):       
    f = dict(random.choice(list(l)))
    return "%s : %s" % (f['font_name'], f['font_css'])

n.b.,编写您的第一个自定义过滤器需要做很多工作,其中包括创建 register 实例、注册您的自定义过滤器 使用 register.filter 装饰器和 loading 你的自定义库 模板中的过滤器。

【讨论】:

  • 试过但我不能使用它,因为它列出了每个字体名称的第一个字符,但它不会只返回一个字体名称
  • {% for f|pick_random in Fo.checkbox.all %} 我必须在这一行插入标签,我该怎么做? (这段代码什么也没显示)
  • 试试:{{Fo.checkbox.all|pick_random}}
  • 这会导致一个小问题,{{ Fo.checkbox.all|random }} 只显示 font_name 但我想显示 font_name + font_css
  • 我已根据您的需要编辑了过滤器功能,并将其重命名为random_font
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
相关资源
最近更新 更多