Django ComboField 改变页面内容

Django ComboField to change page content

我有一个名为 project 的模型项目,其中每个项目都有一个标题、描述和一个日期,其中包括秋季或 Spring,以及年份(例如 2012 年秋季,或 Spring 2013)。通过在我的页面 html 中使用一个简单的 for 循环,我能够成功地用所有项目填充一个页面。但是,我想在页面中有一个带有日期列表(我可以指定)的 ComboField,这样当用户选择一个日期时,只有具有该日期的项目才会出现在页面上。

完成此任务的最佳方法是什么?我应该使用 Django 表单项目还是应该使用 HTML select 标签?如果使用 HTML 标签更好,那么如何实现呢?

盲目编码,在你的 forms.py:

中做这样的事情
from django import Forms

from .models import Project

class ProjectFilterForm(forms.Form):

    range = forms.ChoiceField(choices=[], required=False)

    def __init__(self, *args, **kwargs):
        super(ProjectFilterForm, self).__init__(*args, **kwargs)
        oldest = Project.objects.first()
        newest = Project.objects.last()
        if oldest and newest:
            range_choices = []
            for year in range(oldest.date.year, newest.date.year+1):
                range_choices.append('Spring {}'.format(year))
                range_choices.append('Fall {}'.format(year))
            self.fields['range'].choices = range_choices


    def get_filtered_projects(self):
        if not self.is_valid():
            return []
        choice = self.cleaned_data['range']
        parts = choice.split(' ')
        month_range = [4,5,6,7,8,9] if parts[0] == 'Spring' else [10,11,12,1,2,3]
        year = int(parts[1])
        return Project.objects.filter(date__year=year, date__month__in=month_range)

将表单作为模板的一部分,并在视图中使用 get_filtered_projects 生成项目列表以显示在呈现的页面中。