Django-filter: Passer une valeur initiale

Créé le 28 août 2014  ·  5Commentaires  ·  Source: carltongibson/django-filter

J'ai essayé de transmettre une valeur initiale au formulaire en essayant séparément les méthodes suivantes (yadda étant une valeur d'espace réservé) :

#views.py
def operator_search(request):
    operators = Operator.objects.all()
    f = OperatorFilter(request.GET, initial={'operator_city':'yadda'}, queryset=Operator.objects.all())
    return render(request, 'vendors/operator_search.html', {'filter':f, 'operators':operators})
#forms.py
class OperatorFilter(django_filters.FilterSet):
     operator_city = django_filters.CharFilter(initial="yadda")
     class Meta:
         model = Operator

Ni l'un ni l'autre ne semble fonctionner. Comment puis-je définir une valeur initiale pour le formulaire lors de l'utilisation de django-filters ?

Commentaire le plus utile

dans le cas de ChoiceField, vous pouvez utiliser :
empty_label=None, null_value=<default-value>, null_label=<default-label>

Tous les 5 commentaires

Je me pose également la question, j'ai plongé dans les différents objets Filter, FilterSet et Form et je n'ai pas trouvé de moyen décent de le faire. Je ne crois pas que initial fonctionnera car il utilise un formulaire lié, bien que je n'aie pas trouvé de bon moyen de passer les données elles-mêmes. J'ai trouvé une solution de contournement via QueryDict et en la transmettant à FilterSet, mais il doit y avoir un moyen plus propre de le faire.

Cela vous dérangerait-il de publier un extrait de votre solution de contournement ? Je suis un peu coincé à ce stade et mes utilisateurs sont fatigués d'avoir leurs recherches par défaut en Afghanistan :)

Salut @chromakey - Je pense qu'il s'agit d'une question d'utilisation, il est donc préférable de viser la liste de diffusion .

Cependant, les données du formulaire ne sont que celles transmises au FilterSet, donc si je vous comprends bien, vous devriez pouvoir faire quelque chose comme ceci :

initial = {'operator_city':'yadda'}
initial.update(request.GET)
f = OperatorFilter(initial, ...)

Si ce n'est pas le cas, veuillez suivre et expliquer davantage sur la liste de diffusion . Merci.

J'ai cherché dans la liste de diffusion mais je n'ai pas trouvé de solution. Voici une solution de contournement que j'ai trouvée (à utiliser à votre discrétion):

 ####### WARNING: this is a hack to enable initial filter field selection in django-filters########
# Create a mutable QueryDict object, default is immutable
initial = QueryDict('active_study=True', mutable=True)
# QueryDict update works different than normal dictionary update. Refer to docs.
initial.update(request.GET)
# Place the hacked, mutable QueryDict to the FilterSet.
filter = StudyFilter(initial, queryset=Study.objects.all())

dans le cas de ChoiceField, vous pouvez utiliser :
empty_label=None, null_value=<default-value>, null_label=<default-label>

Cette page vous a été utile?
0 / 5 - 0 notes