Единая панель поиска, управляющая всеми полями с помощью 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