2016-05-03 5 views
2

Ich möchte ListView verwenden, um Listen von Abschlüssen nach Schule und Staat zu erstellen. Zum Beispiel würde ich das Feld "degree_awarded" im Programmmodell verwenden, um eine Liste von "Schulen in Pennsylvania, wo Sie einen Bachelor-Abschluss erhalten können" zu erstellen.Erstellen Sie Listen in ListView von Modellfeld in Django

Modelle

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 

Ansichten

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 

Urls

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'), 

Ich kann nicht herausfinden, wie die Ansicht und URL-Routing zu schreiben, so dass ich die Informationen verwenden, kann ich bereits im Feld degree_awarded des Programmmodells, um eine Liste zu generieren.

Kann mir bitte jemand in die richtige Richtung zeigen?

Vielen Dank.

Bearbeiten: Ich habe die relevanten Modelle hinzugefügt, die ich vorher weggelassen habe. Ich wollte knapp sein. Ich habe auch den letzten Filter hinzugefügt, den ich ausprobiert habe. Es erzeugt immer noch nicht die Grad-Listen sortiert nach Zustand.

+0

Zuerst müssen Sie die richtige queryset zu bekommen. Welcher Teil von "Schulen in Pennsylvania, in denen Sie einen Bachelor-Abschluss erhalten können." findest du schwierig? Weißt du, wie man Schulen mit Staatsschnecke "PA" bekommt? Wissen Sie, wie Sie Schulen mit Bachelor-Studiengängen bekommen? Beachten Sie, dass Sie das 'City'-Modell verpasst haben (ich denke, es hat einen Fremdschlüssel für' State'). – Alasdair

+0

Das Stadtmodell ist nicht relevant. Ich habe es bearbeitet. Ich weiß, wie man all die Dinge macht, die du gefragt hast. Ich habe jedoch Probleme mit QuerySets. Ich weiß nicht wirklich, um alles für das gewünschte Ergebnis zusammenzusetzen. – user2901792

+0

Ich denke, das Stadtmodell ist relevant, wie sonst wirst du eine Liste von Schulen in Pennsylvania bekommen? Wenn Sie wissen, wie Sie diese Abfragen schreiben, fügen Sie sie Ihrer Frage hinzu, und Sie sind auf halbem Weg. – Alasdair

Antwort

2

Ich glaube nicht, dass Sie den ganzen Code in der get_context_data Methode benötigen. Sie sollten die Liste der Objekte anpassen, die in der get_queryset-Methode angezeigt werden sollen.

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 

Lesen Sie die Dokumentation auf lookups that span multiple relationships den school__city__state__slug Filter zu erklären.

Dann in Ihrer Vorlage können Sie eine Schleife durch die Programme, zum Beispiel:

{% for program in object_list %} 
{{ program.degree_awarded %} 
Verwandte Themen