Django-filter -- Как создать фильтр по дате для 2 разных моделей

У меня есть 2 модели: Invoice и Expense. В обеих есть поле даты. Я хочу создать django-фильтр, в котором я помещаю дату начала и дату окончания и получаю результат в двух разных таблицах на одной HTML странице. Пока что мне нужно использовать 2 разных фильтра, и если я помещаю дату в фильтр счета-фактуры, то он очищает фильтр расходов. То же самое, если я помещаю дату в фильтр расходов, он очищает фильтр доходов.

Вот мой filters.py

class DashboardIncomeFilter(django_filters.FilterSet):
start_date = DateFilter(field_name = "invoice_date", lookup_expr='gte', label='Start Date')
end_date = DateFilter(field_name = "invoice_date", lookup_expr = 'lte', label = 'End Date')
class Meta:
    model = Invoice
    fields = '__all__'
    exclude = ['invoice_slug', 'therapist', 'invoice_date', 'service', 'customer', 'invoice_no', 'price', 'quantity', 'total', 'payment', 'balance']


class DashboardExpenseFilter(django_filters.FilterSet):
exp_start_date = DateFilter(field_name = "expense_date", lookup_expr='gte', label='Start Date')
exp_end_date = DateFilter(field_name = "expense_date", lookup_expr = 'lte', label = 'End Date')
class Meta:
    model = Expense
    fields = '__all__'
    exclude = ['expense_date', 'vendor', 'expense_category', 'description','amount']

Только на моем dashboard.html

Наконец, мой views.py

ResultFilter = DashboardIncomeFilter(request.GET, queryset=invoice_list)
invoice_list = ResultFilter.qs

OutcomeFilter = DashboardExpenseFilter(request.GET, queryset=expense_list)
expense_list = OutcomeFilter.qs

Все поля исключены, поскольку я хочу фильтровать только по полю invoice_date и expense_date одновременно. Спасибо.

Когда вы отправляете один из указанных фильтров, выполняется GET-запрос с двумя другими значениями фильтра, относящимися к другой таблице, которая не указана.

Я никогда не пробовал, но я думаю, что вы можете заставить его отправить все четыре с любым из фильтров submit, определив некоторые нулевые фильтры. то же имя, что и в другой таблице, аргумент метода, указывающий на метод, который вообще ничего не делает. Что-то вроде

class DashboardIncomeFilter(django_filters.FilterSet):
    start_date = DateFilter(field_name = "invoice_date", lookup_expr='gte', l  abel='Start Date')
    end_date = DateFilter(field_name = "invoice_date", lookup_expr = 'lte', label = 'End Date')

    # no-op filters
    exp_start_date = DateFilter(field_name = "expense_date", 
         method = no_op, widget=forms.HiddenInput, label='Start Date') # label not needed?
    exp_end_date = DateFilter(field_name = "expense_date", 
         method = no_op, widget=forms.HiddenInput, label = 'End Date')

    class Meta:
        model = Invoice  
        fields = '__all__'
        exclude = ['invoice_slug', 'therapist', 'invoice_date', 'service', 'customer', 'invoice_no', 'price', 'quantity', 'total', 'payment', 'balance']

    def no_op( self, qs, name, value):
        return qs

Аналогично, но "зеркально" для другой таблицы.

widget=forms.HiddenInput должен сделать эти поля невидимыми для пользователей. Смотрите документацию по формам Django и этот ответ.

Сообщите нам, если это сработает.

В этом случае, поскольку поля фильтра идентичны, это может сработать, если вы дадите фильтрам обеих таблиц идентичные имена, так что один и тот же фильтр будет применяться к обеим таблицам. Конечно, это при условии, что вы действительно хотите применить одинаковые даты к обеим таблицам.

Вернуться на верх