Есть ли способ не отображать мою модель в шаблоне?
Я хочу знать, можно ли не показывать/загружать модель продукта при просмотре шаблона. Вместо этого я хочу отображать модель при нажатии кнопки, которая фильтрует результаты перед их отображением
У меня более 30 000 записей в модели Product, и поэтому я не хочу, чтобы они отображались/загружались при просмотре моего шаблона, я знаю, что существует метод paginate_by = '100', но я считаю более полезным фильтровать записи перед их отображением
Примечание: у меня уже есть функция и класс для фильтрации записей модели Product
class barcodeview(ListView):
template_name = "barcode/table.html"
paginate_by = '500'
model= Product
context_object_name = 'product'
# Queryset for filtering product model
def get_queryset(self):
queryset = Product.objects.barcode_filter(
filtr = self.request.GET.get("filtr", ''),
)
return queryset
Поместите форму фильтра в ваш шаблон и выводите модели только тогда, когда форма отправлена.
Шаблон:
<form method="get">
<input ...>
<button type="submit" name="filter">Filter</button>
</form>
view:
class BarCodeView(ListViw):
def get_queryset(self):
if 'filter' not in self.request.GET:
return self.model.objects.none()
filter_form = FilterForm(self.queryset.GET)
if not filter_form.is_valid():
return self.model.objects.none()
qs = super().get_queryset()
if filter_form.cleaned_data['some_filter_field']:
qs = qs.filter(some_field=filter_form.cleaned_data['some_filter_field']
# more filters if your need
...
return qs
Вы можете адаптировать это под свои нужды. Фильтрация также может быть выполнена на форме:
class FilterForm(forms.Form):
some_filter_field = forms.ChoieField(...)
def filter(self, qs):
"""Method added to the original django form, you
will not find it in the documentation"""
if self.cleaned_data['some_filter_field']:
qs = qs.filter(....)
return qs
class BarCodeView(ListView):
def get_queryset(self):
if 'filter' in self.request.GET:
return self.model.none()
form = FilterForm(self.request.GET)
if form.is_valid():
return form.filter(self.model.objects.all())
return self.model.none()
Это не единственные способы, но суть вы уловили.