如何在Django中创建年龄范围过滤器表单?

问题描述

我正在尝试设计一种表单,以允许用户在运行时筛选数据。 我的模型是:

class Case(models.Model):
    country = models.ForeignKey(Country,on_delete=models.CASCADE)
    city= models.ForeignKey(City,on_delete=models.CASCADE)
    name = models.CharField()
    birthdate= models.DateField()

然后,我创建了一个带有两个额外字段 ageFrom ageto 的模型表单,以便用户可以输入两个值(年龄范围)并使用该年龄范围过滤数据。 这是我的表格

class ReportForm(forms.ModelForm):
    #extra fields,which are not in my model,to filter by
    ageFrom = forms.IntegerField()
    ageto = forms.IntegerField()
    def clean(self):
        cleaned_data = super().clean()
        ageFrom = cleaned_data.get("ageFrom")
        ageto = cleaned_data.get("ageto")
        if ageFrom > ageto:
            raise forms.ValidationError("some message ")
            
    class Meta:
        model = Case
        fields = ('country','city','gender')
        template_name = 'report/custom_report.html'

问题在于 clean 方法无法正常工作。即使是ageFrom > ageto,我也不会出错。 其次,我相信有一种更好的方法来实现这种过滤。 您能否帮助我找到按年龄段过滤的最佳方法。还是为了使方法整洁。

解决方法

我认为逻辑应该相反。 ageFrom应该小于ageTo。另外,您还需要从该方法返回已清除的数据值(这就是您得到错误的原因):

def clean(self):
    cleaned_data = super().clean()
    ageFrom = cleaned_data.get("ageFrom")
    ageTo = cleaned_data.get("ageTo")
    if ageFrom < ageTo:
        raise forms.ValidationError("some message ")
    return cleaned_data