2015-08-25 3 views
0

Я хочу иметь список тегов из 10 основных тегов, но отображается в случайном порядке, потому что вес шрифта определит их вес.django for loop случайный порядок определяет

сначала я заказываю объекты и получаю 10 тегов, чем я использую shuffle для ранжирования заказа. Пока это работает. Моя проблема в настоящее время является использование {{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) 

ответ

0

Я бы создал диспетчер модели, чтобы выполнить вашу первоначальную фильтрацию, а затем рандомизировать порядок объектов в вашем представлении. Вы хотите попробовать «толстую» модель, «тонкий» подход к представлению. Чем больше вы можете сделать в своей модели, тем легче будет идти по дороге. Например,

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

Я надеюсь, что помогает! Удачи!

Смежные вопросы