2016-05-03 6 views
2

ListViewを使用して学校と州別の度数リストを生成したいと考えています。たとえば、プログラムモデルのdegree_awardedフィールドに「学士号を取得できるペンシルベニア州の学校」のリストを作成したいと考えています。私は私が既に持っている情報を使用できるように、ビューとURLルーティングを書く方法を見つけ出すことはできませんListViewのリストをdjangoのモデルフィールドから作成する

モデル

class State(models.Model): 
    state_name = models.CharField(max_length=20, default='') 
    state_slug = models.SlugField() 

    def __str__(self): 
     return self.state_slug 

class City(models.Model): 
    city_name = models.CharField(max_length=55, default='') 
    city_slug = models.SlugField() 
    state = models.ForeignKey(State, null=True) 

    def __str__(self): 
     return self.city_slug 

class School(models.Model): 
    school_name = models.CharField(max_length=55, default='') 
    school_slug = models.SlugField() 
    city = models.ForeignKey(City, null=True) 

    def __str__(self): 
     return self.school_slug 

    def sorted_programs(self): 
     return self.program_set.all().order_by('program_name') 

class Program(models.Model): 
    program_name = models.CharField(max_length=100, default='') 
    program_slug = models.SlugField(max_length=100, default='') 
    school = models.ForeignKey(School, null=True) 
    degree_awarded = models.CharField(max_length=10, default='') 

    def __str__(self): 
     return self.program_slug 

ビュー

class SchoolIndexView(ListView): 
    model = State 

    def get_context_data(self, **kwargs): 
     context = super(SchoolIndexView, self).get_context_data(**kwargs) 
     context['state_list'] = State.objects.all().order_by('state_name') 
     return context 

class ProgramInSchoolView(DetailView): 
    model = School 
    template = 'school_detail.html' 

    def get_object(self): 
     school_slug = School.objects.get(
      school_slug=self.kwargs.get('school_slug') 
     ) 
     return school_slug 

    def get_context_data(self, **kwargs): 
     context = super(ProgramInSchoolView, self).get_context_data(**kwargs) 
     context['school'] = self.object 
     context['program_list'] = self.object.program_set.all().order_by('program_name') 

     return context 

class ProgramView(DetailView): 
    model = Program 
    template = 'program_detail.html' 

    def get_object(self): 
     program_slug = Program.objects.get(
      program_slug=self.kwargs.get('program_slug') 
     ) 
     return program_slug 

    def get_context_data(self, **kwargs): 
     context = super(ProgramView, self).get_context_data(**kwargs) 
     context['program'] = self.object 
     context['program_classes'] = self.object.classes_set.all().order_by('class_number') 

     return context 

class DegreeView(ListView): 
    model = Program 
    template = 'degree_list.html' 

    def get_context_data(self, **kwargs): 
     context = super(DegreeView, self).get_context_data(**kwargs) 
     context['state_for_degree'] = State.objects.get(state_slug=self.kwargs.get('state_slug')) 
     context['city_for_degree'] = City.objects.get(city_name=self.kwargs.get('city_name')) 
     context['school_for_degree'] = School.objects.get(school_slug=self.kwargs.get('school_slug')) 
     context['degree_by_state'] = Program.objects.get(degree_awarded=self.kwargs.get('degree_awarded')).filter(school_slug=school_slug).filter(city_slug=city_slug).filter(state_slug=state_slug).order_by('city_name') 

     return context 

のURL

url(r'^(?P<state_slug>[\w-]+)/$', CityInStateView.as_view(), name='state_detail'), 
    url(r'^(?P<state_slug>[\w-]+)/(?P<school_slug>[\w-]+)/$', ProgramInSchoolView.as_view(), name='school_detail'), 
    url(r'^(?P<state_slug>[\w-]+)/(?P<school_slug>[\w-]+)/(?P<program_slug>[\w-]+)/$', ProgramView.as_view(), name='program_detail'), 
    url(r'^(?P<state_slug<[\w-]+)/(?P<program_slug>[\w-]+)/$', DegreeView.as_view(), name='degree_list'), 

プログラムモデルのdegree_awardedフィールドにリストを生成します。

誰かが正しい方向に向けることができますか?

ありがとうございます。

編集:前に除外した関連モデルを追加しました。私は簡潔にしたい。また、私が最後に試したフィルターを追加しました。それでも状態別ソート順リストは作成されていません。

+0

まず、あなたは右のクエリセットを取得する必要があります。 「ペンシルベニア州の学校のどこで学士号を取得できるか」あなたは難しいと思いますか?あなたは州のスラッグ "PA"で学校を取得する方法を知っていますか? batchelors degreeプログラムで学校を取得する方法を知っていますか?あなたが 'City'モデルを見逃してしまったことに注意してください(私には'国家 'には外来キーがあります)。 – Alasdair

+0

都市モデルは関係ありません。私はそれを編集した。私はあなたが尋ねたことのすべてをやる方法を知っています。しかし、私はQuerySetsに苦労しています。私は本当に望む結果のためにそれをまとめておくことを知らない。 – user2901792

+0

私は都市モデルが関連していると思います、ペンシルベニア州の学校のリストをどうやって得るのですか?これらのクエリを書く方法が分かっている場合は、それらを質問に追加してください。その半分になります。 – Alasdair

答えて

2

get_context_dataメソッドでは、すべてのコードが必要とは思われません。 メソッドで表示するオブジェクトのリストをカスタマイズする必要があります。

class DegreeView(ListView): 
    model = Program 
    template = 'degree_list.html' 

    def get_queryset(self): 
     queryset = super(DegreeView, self).get_queryset() 
     # batchelors degrees only 
     queryset = queryset.filter(program_slug=self.kwargs['program_slug']) 
     # filter by state 
     queryset = queryset.filter(school__city__state__slug=self.kwargs['state_slug']) 
     return queryset 

school__city__state__slugフィルタを説明するためにlookups that span multiple relationships上のドキュメントを参照してください。あなたのテンプレートで次に

は、あなたは、例えば、プログラム、ループスルーすることができます

{% for program in object_list %} 
{{ program.degree_awarded %} 
関連する問題