2016-08-06 4 views
1

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

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

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

#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() 

ответ

4

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

  • filter_class в вашем filter_overrides должны быть фильтром, а не виджет. Вы можете предоставить дополнительные аргументы (например, виджет) с помощью клавиши extra, как показано here. Любой параметр, который не принадлежит фильтру, автоматически передается в поле базовой формы.
  • Использование переопределения - это не правильный подход, так как виджет нуждается в конечной точке, предназначенной для конкретного поля, для выполнения автозаполнения. Поскольку конечная точка полезна, она не применима ко всем ForeignKey.
  • django-filter использует обычный Form s, а не ModelForm s, поэтому соответствующий класс 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. Больше информации в docs.

+0

спасибо, Шерпа, ты звезда. Кроме того, я должен был предоставить набор запросов к ModelChoiceFilter, его обязательный параметр. Если вы можете отредактировать свой ответ, он будет завершен. – durdenk

+0

Hm. Это зависит от предпочтения. Если вы хотите вручную передать запрос, то это просто. Вы также можете получить запрос по умолчанию из связанного с этим диспетчера моделей, как показано здесь [https://github.com/carltongibson/django-filter/blob/develop/django_filters/filterset.py#L481-L492). – Sherpa

+0

Эй, это довольно круто, вы считаете, что вносите свой вклад в развитие? В DAL или DF? – jpic