Bonjour,
Voilà mon problème, je travaille avec Django 1.0 et j'ai une des models de ce type:
Et j'aimerais, dans l'interface admin, pouvoir filtrer les éléments de B suivant le champ de A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class A(models.Model): truc = models.TrucField(..) class B(models.Model): a = models.ForeignKey(A)
Cad n'afficher que les B liés à un A pour lequel truc vaut une certaine valeur.
J'ai regardé pas mal les sources Django et j'ai l'impression que ce n'est pas possible de façon "propre".
En effet, Django fait:
- récup de tous les objets dans un query_set
- recup des filtres à partir des arguments passés en GET
- creation d'un filter_spec à partir de la classe FilterSpec (pour l'affichage dans le tableau de filtres à droite par défaut)
- filtre de la query à partir des arguments passés en GET
L'étape 3, pour fonctionner, nécessite que les arguments passés en GET soient des noms de champs du model
Du coup, je pensais à trois solutions possibles qui me semblent toutes les trois aussi moches les unes que les autres.
1 : Dans la classe Admin lié à B, redéfinir la fonction queryset en renvoyant uniquement les objets filtrés de façon perso à la place de TOUT les objets.
Pour l'affichage et l'envoie de l'info vers le serveur, je pensais à une requête ajax qui va demander au serveur de stocker dans le cache le filtre à appliquer sur le champ de A.
Mais bon, c'est pas vraiment le boulot de queryset et c'est pas très générique tout ça.
2 : Aller dans les sources de Django pour faire que la fonction get_filter entre dans l'objet pour filtrer differemment lorsqu'on demande de trier par un champ de B ou par un champ de B.a
Mais bon, pas terrible de bouger les sources Django, ça risque de devenir galère pour changer de version
3 : Créer un FiltreSpec spécial pour B.a qui au lieu de trier sur a trie sur le champ particulier dans a
Quelque chose du genre
class MonFiltre(SpecFilter):
filtre sur B.a.truc
Un peu comme un trouve ici
Mais bon, toujours pas très générique, et puis si je veux aussi trier sur B.a je ne peux plus...
Donc voilà où j'en suis, si quelqu'un peux me donner une bonne astuce pour faire quelque chose de pas trop "moche" qui me permet de filtrer de façon personalisée, ça serait super.
Bonne journée à vous !
Partager