2016-08-06 13 views
1

Hat jemand erfolgreich dal und django-filter zusammen benutzt? Unten versuchen ist meins, Ich habe versucht, filterset_factory zu verwenden, Modellklasse und Felder Liste zu liefern, dann habe ich versucht, futuremodelform zu verwenden. Ich habe,django-filter mit django autocomplete licht

ModelForm hat keine Modellklasse angegeben.

Ich denke, es ist nur einer von vielen Fehlern zu auftreten. Jeder, der das vorher gemacht hat, ich muss filterset_factory verwenden und dynamische Klassen aus Argumenten erstellen, ich möchte auch Widgets überschreiben, damit dal Widgets verwendet werden können.

Antwort

4

Ich bin nicht sehr vertraut mit DAL, aber ich trage zum Django-Filter bei und habe ein gutes Verständnis für seine Interna. Ein paar Anmerkungen:

  • Die filter_class in Ihrem filter_overrides sollte ein Filter, kein Widget sein. Sie können zusätzliche Argumente (z. B. das Widget) über den Schlüssel extra bereitstellen, wie in here zu sehen ist. Jeder Parameter, der nicht zum Filter gehört, wird automatisch an das zugrunde liegende Formularfeld übergeben.
  • Die Verwendung einer Überschreibung ist ohnehin nicht der richtige Ansatz, da das Widget einen feldspezifischen Endpunkt für die Autovervollständigung benötigt. Da der Endpunkt feldspezifisch ist, gilt er nicht für alle ForeignKey s.
  • Django-Filter verwendet regelmäßig Form s, nicht ModelForm s, so eine entsprechende Meta innere Klasse würde nicht konstruiert werden. FutureModelForm scheint sowieso keine automatische Vervollständigung zu bieten - es scheint irrelevant zu sein?

Ihre Fabrik wird Ihre zur automatischen Vervollständigung Filter manuell erzeugen - etwa wie folgt:

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) 

Die Felder in attrs die deklarative API verwenden. Weitere Informationen in der docs.

+0

danke Sherpa, du bist der Star. Abgesehen davon musste ich ModelChoiceFilter nur ein Anfrage-Set zur Verfügung stellen, ein erforderlicher Parameter. Wenn Sie Ihre Antwort bearbeiten können, ist sie vollständig. – durdenk

+0

Hm. Das hängt von der Präferenz ab. Wenn Sie das Abfrage-Set manuell übergeben möchten, ist es einfach. Sie können auch das Standard-Abfrage-Set aus dem verwandten Modellmanager des Felds abrufen, wie hier [https://github.com/carltongibson/django-filter/blob/develop/django_filters/filterset.py#L481-L492] zu sehen ist. – Sherpa

+0

Hey, das ist ziemlich cool, hast du darüber nachgedacht, Upstream beizutragen? Nach DAL oder DF? – jpic

Verwandte Themen