django-filter с автозаполнением django light

Кто-нибудь успешно использовал dal и django-filter вместе? Ниже моя попытка, я попытался использовать filterset_factory, предоставив класс модели и список полей, затем я попытался использовать futuremodelform. Я получил ,

ModelForm не имеет указанного класса модели.

Я думаю, что это просто одна из многих ошибок. Кто-нибудь делал это раньше, я должен использовать filterset_factory и создавать динамические классы из аргументов, я также хочу переопределить виджеты, чтобы можно было использовать виджеты dal.

   #testing filterset
    from dal import autocomplete
    from django.db import models
    class PanFilterSet(django_filters.FilterSet):
        filter_overrides = {
            models.ForeignKey: {
                'filter_class': autocomplete.ModelSelect2,
            },

        }

    def pan_filterset_factory(model,fields):
        meta = type(str('Meta'), (object,), {'model': model,'fields':fields,'form':autocomplete.FutureModelForm})
        filterset = type(str('%sFilterSet' % model._meta.object_name),
                         (PanFilterSet,), {'Meta': meta})
        return filterset

    searchFormFilterSet = pan_filterset_factory(self.model_class,self.final_search_fields)
    f = searchFormFilterSet(self.request.GET, queryset=self.get_queryset())
    print f.form.as_p()

person durdenk    schedule 06.08.2016    source источник


Ответы (1)


Я не очень хорошо знаком с DAL, но я вношу свой вклад в django-filter и неплохо разбираюсь в его внутренностях. Несколько заметок:

  • filter_class в вашем filter_overrides должен быть фильтром, а не виджетом. Вы можете указать дополнительные аргументы (например, виджет) с помощью клавиши extra, как показано здесь. Любой параметр, не относящийся к фильтру, автоматически передается в базовое поле формы.
  • Использование переопределения в любом случае не является правильным подходом, так как виджету требуется конечная точка для конкретного поля для выполнения автозаполнения. Поскольку конечная точка зависит от поля, она не применима ко всем ForeignKey.
  • django-filter использует обычные Form, а не ModelForm, поэтому соответствующий внутренний класс Meta не будет создан. FutureModelForm в любом случае, похоже, не обеспечивает функциональность автозаполнения - это кажется неуместным?

Ваша фабрика должна будет сгенерировать фильтры автозаполнения вручную — что-то вроде следующего:

def dal_field(field_name, url):
    return filters.ModelChoiceFilter(
        name=field_name,
        widget=autocomplete.ModelSelect2(url=url),
    )

def dal_filterset_factory(model, fields, dal_fields):
    attrs = {field: dal_field(field, url) for field, url in dal_fields.items()}
    attrs['Meta'] = type(str('Meta'), (object,), {'model': model,'fields': fields})

    filterset = type(str('%sFilterSet' % model._meta.object_name),
                     (FilterSet,), attrs)
    return filterset

# Usage:

# mapping of {field names: autocomplete endpoints}.
dal_fields = {'birth_country': 'country-autocomplete'}
fields = ['list', 'or', 'dict', 'of', 'other', 'fields']
SomeModelFilterSet = dal_filterset_factory(SomeModel, fields, dal_fields)

Поля в attrs используют декларативный API. Дополнительные сведения см. в документах.

person Sherpa    schedule 11.08.2016
comment
спасибо Шерпа, ты звезда. За исключением этого, мне нужно было только предоставить набор запросов для ModelChoiceFilter, это обязательный параметр. ЕСЛИ вы можете отредактировать свой ответ, он будет полным. - person durdenk; 15.08.2016
comment
Хм. Это будет зависеть от предпочтений. Если вы хотите вручную передать набор запросов, то это просто. Вы также можете получить набор запросов по умолчанию из связанного с полем диспетчера моделей, как показано здесь. - person Sherpa; 22.08.2016
comment
Эй, это довольно круто, вы не думали внести свой вклад в апстрим? В DAL или DF? - person jpic; 16.04.2017
comment
Привет, @jpic. Я @rpkilby на GitHub и регулярно вношу свой вклад в django-filter. Я не думаю, что этот код принадлежит DF, но вы можете добавить его в DAL. - person Sherpa; 18.04.2017
comment
Для меня сработала простая передача виджета в фильтр. Также мне нужно было загрузить JS в шаблоны, конечно. - person jpic; 18.04.2017
comment
@jpic - я передал виджет фильтру и добавил {% block footer %} <script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}?{% now "U" %}"></script> {{ form.media }} {% endblock %} в свой шаблон. есть мысли о том, почему он показывает только пустое поле выбора с указателем Django ------? статические файлы также не отображаются в моем браузере. - person OverflowingTheGlass; 07.09.2017
comment
Может блок не отображается? - person jpic; 08.09.2017