django for循环随机顺序确定

时间:2015-08-25 18:13:10

标签: python django for-loop random

我想要一个包含10个主要标签的标签列表,但是以随机顺序显示,因为字体重量将决定它们的重量。

首先我订购对象并获得10个标签,而不是使用随机播放来随机化订单。到目前为止它的作用。我现在的问题是在模板中使用{{forloop.counter0}},它以随机顺序输出以下代码:

    <tr>
        <td class="tag-0">Tag3</td>
    </tr>
    <tr>
        <td class="tag-1">Tag1</td>
    </tr>
    <tr>
        <td class="tag-2">Tag2</td>
    </tr>

相反,我希望它是这样的:

<tr>
    <td class="tag-2">Tag3</td>
</tr>
<tr>
    <td class="tag-0">Tag1</td>
</tr>
<tr>
    <td class="tag-1">Tag2</td>
</tr>

模板:

{% for t in tags %}
    <tr>
        <td class="tag-{{forloop.counter0}}">{{t.title}}</td>
    </tr>
{% endfor %}

在观点中:

tags = list(Model.objects.order_by('title')[:10])
random.shuffle(tags)

1 个答案:

答案 0 :(得分:1)

我会创建一个模型管理器来进行初始过滤,然后随机化视图中对象的顺序。你想尝试采取“胖”模式,“瘦”视图方法。您可以在模型中执行的操作越多,就越容易进行更改。例如,

<强> models.py:

class FooManager(models.Manager):
    def get_titles(self):
        return super(FooManager, self).get_queryset.order_by('title')

class Foo(models.Model):
    title = models.CharField(max_length=120)

    objects = FooManager()

    def __unicode__(self):
        return self.title

<强> views.py:

def view(request):
    get_titles = Foo.objects.get_titles()[:10]
    titles = list(get_titles)
    random.shuffle(titles)

    context = {
        'titles': titles
    }
    return render(request, 'template.html', context)

您的模板也变得更加轻松。

<强> HTML:

{% for t in titles %}
    {{ t.title }}
{% endfor %}

我希望有所帮助!祝你好运!