J'ai un modèle dans Flask-Admin avec filtre (par exemple basé sur une clé étrangère vers un autre modèle).

Je veux générer des liens du front-end vers cette vue de modèle dans admin avec une valeur de filtre appliquée. J'ai remarqué qu'il ajoute ?flt0_0= à url, de sorte que l'adresse entière ressemble un peu:

http:/.../admin/model_view_<my model>/?flt0_0=<filter value>

Quelle est la meilleure façon de générer des itinéraires comme celui-ci?

4
vdikan 7 mars 2016 à 00:53

3 réponses

Meilleure réponse

Malheureusement, il n'y a pas encore d'API publique pour cela. Voici un court extrait que vous pouvez utiliser pour l'instant pour générer une chaîne de requête fltX_Y:

class MyView(BaseModelView):
...
    def get_filter_arg(self, filter_name, filter_op='equals'):
        filters = self._filter_groups[filter_name].filters
        position = self._filter_groups.keys().index(filter_name)

        for f in filters:
            if f['operation'] == filter_op:
                return 'flt%d_%d' % (position, f['index'])

Ensuite, vous pouvez appeler cette méthode sur une instance de votre vue:

print my_view.get_filter_arg('Name', 'contains')
5
Joes 31 mai 2016 à 23:17

Je préfère définir named_filter_urls=True sur ma vue de base pour se débarrasser de ces nombres magiques (bien que vous puissiez également le définir sur n'importe quelle vue spécifique):

class MyBaseView(BaseModelView):
    ...
    named_filter_urls = True


class MyView(MyBaseView):
    ...
    column_filters = ['name', 'country']

Cela crée des URL comme: http://.../admin/model/?flt_name_equals=foo&flt_country_contains=bar (*)

Avec cela, vos URL peuvent facilement être construites en utilisant le nom de l'attribut sur lequel vous souhaitez filtrer. En prime, vous n'avez pas besoin d'avoir une instance de vue disponible - important si vous souhaitez créer un lien vers une vue pour un modèle différent.

* (Lors de la sélection de filtres dans l'interface utilisateur, Flask-Admin insère des entiers dans les clés de paramètres. Je ne sais pas pourquoi il le fait, mais ils ne semblent pas nécessaires pour un filtrage simple.)

4
nfelger 22 janv. 2018 à 11:53

Flask-Admin utilise par défaut la syntaxe flt0_0=<value> pour être "robuste sur toutes les traductions" si votre application doit prendre en charge plusieurs langues. Si vous n'avez pas à vous soucier des traductions, le réglage named_filter_urls=True est la solution.

Avec named_filter_urls=True Flask-Admin génère des paramètres de requête de filtre comme:

flt0_country_contains=<value>

L'entier restant après flt (0 dans ce cas) est une clé de tri utilisée pour contrôler l'ordre des filtres tels qu'ils apparaissent dans l'interface utilisateur lorsque plusieurs filtres sont définis. Ce nombre n'a pas d'importance du tout si vous avez un seul filtre.

Par exemple, dans mon application, j'ai nommé les filtres activés. Si j'ai plusieurs filtres sans la clé de tri , les filtres sont affichés dans l'ordre dans lequel ils apparaissent dans la chaîne de requête :

?flt_balance_smaller_than=100&flt_balance_greater_than=5

Rendements: Ordre des filtres par défaut

Avec une clé de tri ajoutée aux paramètres flt, je peux alors forcer ces filtres à être affichés dans un ordre différent (flt1 viendra avant flt2):

?flt2_balance_smaller_than=100&flt1_balance_greater_than=5

Rendements: Commande forcée des filtres

En pratique, il semble que cette clé de tri puisse être n'importe quel caractère , par exemple cela fonctionne aussi:

?fltB_balance_smaller_than=100&fltA_balance_greater_than=5

Ce comportement est finalement défini dans la méthode Flask-Admin BaseModelView._get_list_filter_args() ici: https: // github. com / flask-admin / flask-admin / blob / master / flask_admin / model / base.py # L1714-L1739

4
Carlton Duffett 31 juil. 2019 à 19:25