Проблема django_filters с gte, lte

Я пытаюсь фильтровать по DateField, используя либу django_filters. Следуя документу, я столкнулся с проблемой с выражениями lookup_expressions "gte" и "lte" (я пробовал оба). Проблема в том, что они возвращают результаты только в том случае, если дата, которую я ввожу в datepicker, является точной датой, что, как я предполагаю, будет ожидаемым результатом "iexact" или "exact" lookup_expression. Вот мой упрощенный код, обратите внимание, что я пробовал использовать только одну дату (удалив end_date в model и filter.py) и результат был тот же, так что я не верю, что это проблема диапазона

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
Вернуться на верх