从 django 中的模型字段在 ListView 中创建列表

Posted

技术标签:

【中文标题】从 django 中的模型字段在 ListView 中创建列表【英文标题】:Create lists in ListView from model field in django 【发布时间】:2016-05-03 11:53:15 【问题描述】:

我想使用 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'),

我不知道如何编写视图和 url 路由,以便可以使用程序模型的 degree_awarded 字段中已有的信息来生成列表。

有人可以指点我正确的方向吗?

谢谢。

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

【问题讨论】:

首先你需要得到正确的查询集。 “宾夕法尼亚州的学校,您可以获得学士学位的地方”的哪一部分。你觉得困难吗?你知道如何让学校有州蛞蝓“PA”吗?你知道如何让学校获得学士学位课程吗?请注意,您错过了 City 模型(我猜它有一个指向 State 的外键)。 城市模型不相关。我把它编辑了。我知道如何做你问的所有事情。但是,我与 QuerySets 斗争。我真的不知道将它们放在一起以获得预期的结果。 我认为城市模型是相关的,否则您将如何获得宾夕法尼亚州的学校列表?如果您知道如何编写这些查询,请将它们添加到您的问题中,您就成功了一半。 我需要按州而不是按城市的学校。我可以使用视图中的查询按州查询学校。困难的部分是知道如何从 Program 模型中提取 degree_awarded 字段以按状态查询学位。我不知道该怎么做。我试过过滤,但这不起作用。两天后,我在这里问这个问题。 我明白了。我不想要代码。我想学习如何自己做。我会尽快更新。 【参考方案1】:

我认为您不需要 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 %

【讨论】:

以上是关于从 django 中的模型字段在 ListView 中创建列表的主要内容,如果未能解决你的问题,请参考以下文章

Django:从服务器上的现有文件手动创建模型中的图像字段

从 Django 中的文本字段填充管理表单

如何从默认 Django 模型重命名模型字段?

从显示自定义字段的 Django 模型呈现可排序表的最佳方法?

如何从 django 模型中为模型字段定义 json 类型

将 Django 模型字段的类型从 CharField 更改为 ForeignKey