Skip to main content
 首页 » 编程设计

python之从 Django 中的模型字段在 ListView 中创建列表

2024年10月24日31zhujiabin

我想使用 ListView 按学校和州生成学位列表。例如,我想使用 Program 模型中的 degree_awarded 字段来列出“宾夕法尼亚州可以获得学士学位的学校”。

模型

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

我无法弄清楚如何编写 View 和 url 路由,以便我可以使用我在 Program 模型的 degree_awarded 字段中已有的信息来生成列表。

有人能给我指出正确的方向吗?

谢谢。

编辑:我添加了之前遗漏的相关模型。我想简明扼要。我还在我试过的最后一个过滤器中添加了。它仍然没有生成按州排序的学位列表。

请您参考如下方法:

我认为您不需要 get_context_data 方法中的所有代码。您应该自定义要在 get_queryset 中显示的对象列表方法。

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 

请参阅 lookups that span multiple relationships 上的文档解释 school__city__state__slug 过滤器。

然后在您的模板中,您可以循环遍历程序,例如:

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