2017-05-05 4 views
1

Djangoで階層ビューを作成しようとしていますが、私はQuerySetsを効果的に使用する方法を理解するのに苦労しています。コースの各グループは、div要素に包まれて、私の見解ではDjangoで階層ビューを作成する

をスタイリングなどられる

Main Course 1 --- Child Course 1 
       --- Child Course 2 

Main Course 2 --- Child Course 3 
       --- Child Course 4 

は私が最終的にを目指してることは、このようにコースを表示するHTMLページです。

class HierarchyView(generic.ListView): 
template_name = 'curriculum/hierarchy.html' 

def get_queryset(self): 
    return Offering.objects.all() 

def get_context_data(self, **kwargs): 
    context = super(HierarchyView, self).get_context_data(**kwargs) 
    context['main'] = self.get_queryset().filter(course_type='M') 
    context['sub'] = self.get_queryset().filter(parent_code__in=context['main']) 
    return context 

募集モデルはようparent_codeはトンのような自己参照の外部キー(つまり、すべてのコースは、他の子にすることができます)、ある設定されている:私は、次のしているPYファイル彼:

... 
parent_code = models.ForeignKey(
    'self', 
    null=True, 
    blank=True, 
    on_delete=models.SET_NULL) 
... 

そして、私のHTMLテンプレートで

は、私が持っている:

これは、その結果どのような
{% for mainoffering in main %} 
<div> 
<div>{{ mainoffering.course_name }}</div> 
    {% for offering in sub %} 
    <div>{{ offering.course_name }}</div> 
    {% endfor %} 
</div> 
{% endfor %} 

、しかし、すべての子のコースは、彼らが実際にあるかどうかにかかわらず、すべてのメインコースの下に表示されていることですそのコースの子供たちは、私が何をしているのかは明らかではありません。

私はまだDjangoでロープを学んでいます。私は何が必要なのかを普通の英語で説明するものを見つけるのに苦労しています。助けてください!

+1

あなたが必要なものはdjango-mpttです – e4c5

答えて

0

私は、それぞれの子コースをその親コースに合わせるためにテンプレートを変更する必要があると思います。多分何か:

{% for mainoffering in main %} 
<div> 
<div>{{ mainoffering.course_name }}</div> 
    {% for offering in sub %} 
    {% if offering.parent_code == mainoffering %} 
     <div>{{ offering.course_name }}</div> 
    {% endif %} 
    {% endfor %} 
</div> 
{% endfor %} 
0

文脈あなたは物事のカップルは、目的の動作を取得するために行うことができます任意のグループ化せずに、それらのすべてを返します[「サブ」]、発注など。

プリフェッチに関連することができます。

from django.db.models import Prefetch 

offerings = Offering.objects.filter(course_type='M').prefetch_related(
    Prefetch(
     "courses_subset", 
     queryset=Offering.objects.filter(parent_code__in=offerings), 
     to_attr="sub" 
    ) 
) 
for o in offerings:   
    print o.sub 

あなたが実際にこのモデル内のメソッドにすると(私はほとんどの場合、これを使用すると思います)テンプレートタグを作成することができます。テンプレートで

@register.simple_tag 
def get_child_courses(course): 
    return course.get_child_courses() 

template tag

def get_child_courses(self): 
    child_courses = Offerings.objects.filter(parent_code=self.id) 
    return child_courses 

method in your Offering model

{% for mainoffering in main %} 
<div> 
<div>{{ mainoffering.course_name }}</div> 
    {% for offering in mainoffering|get_child_course %} 
    <div>{{ offering.course_name }}</div> 
    {% endfor %} 
</div> 
{% endfor %} 

あなたはグループ彼らはあなたのテンプレートにaccrazeによって提案することができますよう。私は個人的に2番目のオプションのために行くだろう

+0

私はあなたの方法を使用して終わるかもしれませんが、誉れの解決策が頭に釘を打つ! – Luke

関連する問題