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 и этот ответ.
Сообщите нам, если это сработает.
В этом случае, поскольку поля фильтра идентичны, это может сработать, если вы дадите фильтрам обеих таблиц идентичные имена, так что один и тот же фильтр будет применяться к обеим таблицам. Конечно, это при условии, что вы действительно хотите применить одинаковые даты к обеим таблицам.