2014-12-15 3 views
0

Я пытаюсь сгруппировать таблицу, выводимую одним из ее столбцов. Ниже приводится модель (да, это звезда трек-тематический сайт я строю ... обучение Джанго на пути):Группировка в Django View

class ShipClass (models.Model): 
    ALLEGIENCE_CHOICES = (
    ('FED', 'Federation'), 
    ('KGE', 'Klingon Empire'), 
    ('RSE', 'Romulan Star Empire') 
    ) 
    Origin = models.CharField(max_length=3, choices=ALLEGIENCE_CHOICES, default='FED') 
    ClassName = models.CharField(max_length=20) 
    NumberOfCrew = models.IntegerField() 

    def __str__(self): 
     return self.ClassName 

    class Meta: 
     unique_together = ("Origin", "ClassName") 

То, что я пытаюсь сделать, это вывести вид этой модели таким образом, что список, по-видимому, сгруппирован по его выбору Allegiance. Как выполнить группировку на уровне шаблона?

, такие как

  • Федерация
    • Дунай
    • Galaxy
  • Клингон
    • Хищная птица

Спасибо.

+1

Какова взаимосвязь между пунктами в таблицах и суб-таблицы? Я предполагаю, что Федерация - это поле Origin, но как насчет Дуная и Галактики? –

ответ

1

вы можете использовать ifchanged

qs = ShipClass.objects.order_by("Origin", "Classname") 


{% for entry in qs %} 
    {% ifchanged entry.Origin %} 
     {{ entry.Origin }} 
    {% endifchanged %} 
    {{ entry.Classname }} 
{% endfor %} 
+0

Hi Sax. Мне нравится ваша идея, но я получаю сообщение об ошибке: \t аргумент типа «QuerySet» не является итерируемой помощью? – arcee123

+0

странно. просто проверен с помощью другого класса. где u положил эту строку 'qs = ShipClass.objects.order_by (" Origin "," Classname ")'? версия django? – sax

+0

Я понял. Для первого render_to_response требуется тег {"qs": qs} как набор записей (моя глупость в noob) .... second, ClassName, а не Classname. В противном случае, Совершенство. Благодарю. – arcee123

0

На ваш взгляд, вы можете создать словарь, ключи которого являются именами и именами подписей, являются списком имен классов для этой верности. Для того, чтобы получить ключи Вы можете сначала access your model's choices, а затем петлю через каждый сделать запрос фильтра, чтобы получить соответствующие списки Classname, что-то вроде:

starship_classes_by_allegiance = {} 
for choice in ShipClass._meta.get_field('Origin').choices: 
    allegiance_id, allegiance_label = choice 
    starship_classes_by_allegiance[allegiance_label] = ShipClass.objects.filter(Origin=allegiance_id).values('ClassName').distinct() 

, то вы можете пройти по этой Dict в шаблоне, как:

{% for allegiance_label in starship_classes_by_allegiance %} 

    {{ allegiance_label }} 

    <ul> 
    {% for class_name in starship_classes_by_allegiance.allegiance_label %} 

     <li>{{ class_name }}</li> 

    {% endfor %} 
    </ul> 

{% endfor %} 
Смежные вопросы