django_filters gte、lte 问题
django_filters issue with gte, lte
我正在尝试使用 django_filters 库按 DateField 进行过滤。按照文档,我遇到了“gte”和“lte”lookup_expressions 的问题(我都试过了)。问题是,如果我在日期选择器中输入的日期是确切日期,它只会产生 return 结果,我怀疑这将是预期的“iexact”或“exact”lookup_expression 结果。这是我的简化代码,请注意,我尝试只使用一个日期(在模型和 filter.py 中删除 end_date),结果是一样的,所以我不认为这是一个范围问题
Model
class Replacement(models.Model):
start_date = models.DateField(
null=True, blank=True)
end_date = models.DateField(
null=True, blank=True)
filter.py
#not sure if this DateInput is related to the issue, just a way to attach "date" type so as to get a datepicker on template
class DateInput(forms.DateInput):
input_type = 'date'
class ReplacementFilter(django_filters.FilterSet):
start_date = DateFilter(field_name="start_date", lookup_expr='gte')
end_date = DateFilter(field_name="end_date", lookup_expr='gte')
class Meta:
model = Replacement
fields = ['start_date', 'end_date']
start_date = django_filters.DateFilter(
widget=DateInput(attrs={'type': 'date'}))
end_date = django_filters.DateFilter(
widget=DateInput(attrs={'type': 'date'}))
Views
def replacement_list_page(request):
replacements = Replacement.objects.all()
replacement_filter = ReplacementFilter(request.GET, queryset=replacements)
print(replacement_filter)
return render(request, "replacements/replacementlist.html", {"replacement": replacements,
'filter': replacement_filter})
谢谢
您将 start_date
和 end_date
定义了两次 ,一次是 lookup_expr
,一次是 widget
,作为结果,最后定义的 DateFilter
将被使用,因此省略了较早定义的 start_date
和 end_date
.
因此您应该定义 FilterSet
为:
class ReplacementFilter(django_filters.FilterSet):
start_date = DateFilter(
field_name='start_date',
lookup_expr='gte',
widget=DateInput(attrs={'type': 'date'}) # 🖘 specify widget
)
end_date = DateFilter(
field_name='end_date',
lookup_expr='gte',
widget=DateInput(attrs={'type': 'date'}) # 🖘 specify widget
)
class Meta:
model = Replacement
fields = ['start_date', 'end_date']
# no new definitions of start_date and end_date
我正在尝试使用 django_filters 库按 DateField 进行过滤。按照文档,我遇到了“gte”和“lte”lookup_expressions 的问题(我都试过了)。问题是,如果我在日期选择器中输入的日期是确切日期,它只会产生 return 结果,我怀疑这将是预期的“iexact”或“exact”lookup_expression 结果。这是我的简化代码,请注意,我尝试只使用一个日期(在模型和 filter.py 中删除 end_date),结果是一样的,所以我不认为这是一个范围问题
Model
class Replacement(models.Model):
start_date = models.DateField(
null=True, blank=True)
end_date = models.DateField(
null=True, blank=True)
filter.py
#not sure if this DateInput is related to the issue, just a way to attach "date" type so as to get a datepicker on template
class DateInput(forms.DateInput):
input_type = 'date'
class ReplacementFilter(django_filters.FilterSet):
start_date = DateFilter(field_name="start_date", lookup_expr='gte')
end_date = DateFilter(field_name="end_date", lookup_expr='gte')
class Meta:
model = Replacement
fields = ['start_date', 'end_date']
start_date = django_filters.DateFilter(
widget=DateInput(attrs={'type': 'date'}))
end_date = django_filters.DateFilter(
widget=DateInput(attrs={'type': 'date'}))
Views
def replacement_list_page(request):
replacements = Replacement.objects.all()
replacement_filter = ReplacementFilter(request.GET, queryset=replacements)
print(replacement_filter)
return render(request, "replacements/replacementlist.html", {"replacement": replacements,
'filter': replacement_filter})
谢谢
您将 start_date
和 end_date
定义了两次 ,一次是 lookup_expr
,一次是 widget
,作为结果,最后定义的 DateFilter
将被使用,因此省略了较早定义的 start_date
和 end_date
.
因此您应该定义 FilterSet
为:
class ReplacementFilter(django_filters.FilterSet):
start_date = DateFilter(
field_name='start_date',
lookup_expr='gte',
widget=DateInput(attrs={'type': 'date'}) # 🖘 specify widget
)
end_date = DateFilter(
field_name='end_date',
lookup_expr='gte',
widget=DateInput(attrs={'type': 'date'}) # 🖘 specify widget
)
class Meta:
model = Replacement
fields = ['start_date', 'end_date']
# no new definitions of start_date and end_date