Есть ли способ не отображать мою модель в шаблоне?

Я хочу знать, можно ли не показывать/загружать модель продукта при просмотре шаблона. Вместо этого я хочу отображать модель при нажатии кнопки, которая фильтрует результаты перед их отображением

У меня более 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()

Это не единственные способы, но суть вы уловили.

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