Django Для использования двух классов FilterView в одном шаблоне
Я создаю форму поиска с использованием FilterView в главном окне. Дважды щелкните на форме ввода в форме поиска в главном окне, чтобы отобразить модальную форму. Я хочу отобразить в модале другой класс FilterView. Класс этих двух FilterView отличается в модели, фильтре и форме, на которую они ссылаются. Как этого можно добиться?
Views.py
class Filter1(FilterView):
model = Model1
filterset_class = Filter1
template_name = 'filter.html'
class Filter2(FilterView):
model = Model2
filterset_class = Filter2
template_name = 'filter.html'
HTML(шаблоны)
<form action="" method="get">
<div class="row">
{{filter.form|crispy}} <-I want to use class filter 1
</div>
<div id="myModal" class="modal fade" tabindex="-1" role="dialog">
・・・
{{filter.form|crispy}} <- I want to use class filter 2
</div>
Вы не можете использовать его таким образом. Один запрос будет вызывать только один API/url бэкенда за раз и возвращать один ответ. Что вы можете сделать, так это отправить фильтры как контекст в одном ответе. Например:
filter1 = Filter1()
filter2 = Filter2()
context = {
'filter1': filter1,
'filter2': filter2,
'result': result,
}
return render(request, '<your template name>', context)
Это должно решить вашу проблему. Или вы можете использовать JavaScript для выполнения вызова API при нажатии на модальную кнопку и использовать отдельный URL-маршрут для получения JSON-ответа для вашего фильтра в модале. Использование JavaScript и выполнение AJAX-запроса является рекомендуемым подходом, поскольку это уменьшит количество данных, возвращаемых за один вызов, и не будет содержать ненужных текстов в ответе, если они не нужны.
Спасибо за ваш ответ. Но это не сработалоМожете ли вы рассказать мне немного больше об этом?
Я пробовал. Но он не отображается. Возможно ли передать класс в контекст как словарь?
class test(TemplateView):
def get(self, request):
filter1 = Filter1()
filter2 = Filter2()
context = {
'filter': filter1,
'filter2': filter2,
}
print(context)
return render(request, '/filter.html', context)