Django-tables2: Autoriser les colonnes de tri décroissant à placer des valeurs vides au bas de la colonne

Créé le 2 août 2018  ·  6Commentaires  ·  Source: jieter/django-tables2

Lorsque je travaillais avec des colonnes descendantes dans #595 et #597 , je suis tombé sur un comportement de tri descendant qui semble un peu décalé.

Considérons un ensemble de données comme celui-ci :

| Enregistrer | Valeur |
| --- | --- |
| A | 3 |
| B | 1 |
| C | - |
| D | - |

Lors du tri de la colonne Valeur par ordre croissant, les valeurs vides sont poussées en bas de la liste :

| Enregistrer | Valeur |
| --- | --- |
| B | 1 |
| A | 3 |
| C | - |
| D | - |

Mais lors du tri par ordre décroissant, les valeurs vides sont placées en haut de la liste :

| Enregistrer | Valeur |
| --- | --- |
| C | - |
| D | - |
| A | 3 |
| B | 1 |

Dans certains cas, un utilisateur souhaiterait « ignorer » les valeurs vides lors du tri par ordre décroissant, et ainsi les pousser vers le bas de la liste, de la même manière qu'avec l'ordre croissant. Cela peut-il être fait?

Commentaire le plus utile

Hah, eh bien, je me suis peut-être dissuadé d'avoir besoin d'un RP. Dans mon exemple, le comportement souhaité peut être obtenu en utilisant la méthode order_FOO() et le paramètre nulls_last Django. Ainsi:

def order_value(self, QuerySet, is_descending): if is_descending: QuerySet = QuerySet.order_by(F('value').desc(nulls_last = True)) else: QuerySet = QuerySet.order_by(F('value').asc(nulls_last = True)) return (QuerySet,True)

Il en résulte que les valeurs nulles sont toujours triées à la fin de la colonne. Cela fonctionne pour les cas où j'en ai besoin, car je peux m'assurer que ma base de données utilise toujours null pour les valeurs vides.

J'ai testé cette solution pour les cas où les valeurs sont simplement vides et cela ne fonctionne pas. Je soupçonne qu'une solution pourrait être trouvée en modifiant quelque chose dans le comportement de django-tables2 order_by , mais si nous parlons de toute façon d'un cas limite, peut-être le sort-with-nulls-last order_FOO() solution order_FOO() est meilleure que de jouer avec la source.

Dans tous les cas, je peux considérer ma demande comme close. Si quelqu'un d'autre réclame de traiter les valeurs strictement vides de la même manière, peut-être qu'un PR peut être revisité.

Tous les 6 commentaires

Avez-vous vu #529 ?

Oh, je le vois maintenant. Hm, peut-être que je peux jeter un œil à faire un PR pour ça aussi.

Serait très bienvenu !

Hah, eh bien, je me suis peut-être dissuadé d'avoir besoin d'un RP. Dans mon exemple, le comportement souhaité peut être obtenu en utilisant la méthode order_FOO() et le paramètre nulls_last Django. Ainsi:

def order_value(self, QuerySet, is_descending): if is_descending: QuerySet = QuerySet.order_by(F('value').desc(nulls_last = True)) else: QuerySet = QuerySet.order_by(F('value').asc(nulls_last = True)) return (QuerySet,True)

Il en résulte que les valeurs nulles sont toujours triées à la fin de la colonne. Cela fonctionne pour les cas où j'en ai besoin, car je peux m'assurer que ma base de données utilise toujours null pour les valeurs vides.

J'ai testé cette solution pour les cas où les valeurs sont simplement vides et cela ne fonctionne pas. Je soupçonne qu'une solution pourrait être trouvée en modifiant quelque chose dans le comportement de django-tables2 order_by , mais si nous parlons de toute façon d'un cas limite, peut-être le sort-with-nulls-last order_FOO() solution order_FOO() est meilleure que de jouer avec la source.

Dans tous les cas, je peux considérer ma demande comme close. Si quelqu'un d'autre réclame de traiter les valeurs strictement vides de la même manière, peut-être qu'un PR peut être revisité.

Merci d'avoir expliqué !

merci pour cette belle solution de contournement @foldedpaper :)

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

Questions connexes

brianmay picture brianmay  ·  6Commentaires

blite picture blite  ·  3Commentaires

mpasternak picture mpasternak  ·  9Commentaires

wtfrank picture wtfrank  ·  32Commentaires

applegrew picture applegrew  ·  17Commentaires