Единая панель поиска, управляющая всеми полями с помощью django-filter и django-tables2 через Jquery

Мне нужно управлять django-table2 с помощью django-filter через jquery. Пожалуйста, помогите мне, как я могу получить доступ к этому через jquery и как мне передать queryset в django-filter

Я располагаю свое окно поиска следующим образом:

где я передаю модели динамическим способом, поскольку я использую их в общих целях.

<input type="hidden" name="model_name" value="{{view.class_name}}" id="model_name">
<input type="text" name="search_data" id="search_data" class=" search_data form-control pl-4" placeholder="Search..." value="{{search_key}}">

Сценарий, который я использую

        $('.search_data').keyup(function(){
            var search_key = $.trim($(this).val());
            model_name = $('#model_name').val();
            url = '/org/' + model_name.toLowerCase() + '/?search_key='+search_key
            window.location = url
        });

Здесь я использую динамическое представление списка

def generate_views(model_type):
    friendly = model_type.__name__.lower()
    app_label = model_type._meta.app_label
    admin_class = admin.site._registry.get(model_type)

    if admin_class and not admin_class.form == ModelForm:
        _form_class = admin_class.form
    else:
        _form_class = forms.generate_form(model_type)

    class ListView(
            mixins.LoginRequiredMixin,
            mixins.PermissionRequiredMixin,
            FilterView,
            ExportMixin,
            SingleTableView,
    ):

        class_name = model_type.__name__
        permission_required = [f'{app_label}.view_{friendly}']
        template_name = f'generic/object_list.html'
        model = model_type
        filterset_class = filters.generate_filterset(model_type)
        table_class = tables.generate_table(model_type)
        table_pagination = { 'per_page': settings.DJANGO_TABLES2_PER_PAGE }

        def get_context_data(self, **kwargs):
            context = super(ListView, self).get_context_data(**kwargs)
            search_key = self.request.GET.get('search_key', '')
            if search_key:
                context['search_key'] = search_key
            return context
        def get_queryset(self):
            search_key = self.request.GET.get('search_key', '')
            fields = filters.build_fields(model_type)
            queryset = model_type.objects.all()
            if search_key:
                for field in fields:
                    lookup = "%s__contains" % field
                    query = {lookup : search_key}
                    queryset = model_type.objects.filter(**query)
            return queryset

И динамические наборы фильтров

def build_fields(model_type):

    fields = [
        f.name for f in model_type._meta.get_fields()
        if type(f) in SUPPORTED
    ]

    return fields


def generate_filterset(model_type):

    class FilterSet(django_filters.FilterSet):
        class Meta:
            model = model_type
            fields = build_fields(model_type)

    return FilterSet

И стол

def build_list_display(model_type):
    try:
        model_admin = admin.site._registry[model_type]

        if (
                '__str__' in model_admin.list_display
                and len(model_admin.list_display) == 1
        ):
            # Ignore the default list_display
            # ['__str__']
            return None
        else:
            return model_admin.list_display

    except (KeyError, AttributeError):
        # Do nothing
        return None


def generate_table(model_type):
    friendly = model_type.__name__.lower()
    app_label = model_type._meta.app_label

    class Table(tables.Table):
        actions = tables.TemplateColumn(make_actions_column(app_label, friendly))

        class Meta:
            model = model_type
            fields = build_list_display(model_type)
            empty_text = 'No records to display'
            attrs = {
                'class': 'table table-head-custom table-head-bg'
            }

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