6
votes

Comment préserver la sélection du filtre après enregistrer à Django admin

Tout d'abord, j'ai examiné ce Question , mais c'est de plus d'un an . Sûrement maintenant, il y a un bon moyen dans Django 1.1.1 de transporter une sélection de filtres en avant après qu'un utilisateur clique sur le bouton Enregistrer dans l'administrateur.

Dans une table avec des milliers d'enregistrements, le filtrage est essentiel. Et si un utilisateur fait plusieurs choix de filtres que les efforts ne devraient pas nécessairement être répétés.


0 commentaires

4 Réponses :


8
votes

La réponse est toujours la même: hors de la boîte, Django ne supporte pas ce comportement. Il y a quelques billets dans le numéro de suivi avec des correctifs: # 3777 , # 6903 . La classe de middleware dans Ce commentaire fonctionne sans modifier le code Django.


2 commentaires

J'aime la solution middleware. Merci!


Génial, résout un gros problème pour mes utilisateurs! Ce patch a été assis là pendant 6 ans ...



0
votes

Une autre solution consiste à utiliser cet extrait http://djangosnippets.org/snippets/2531/

Class Modeladmin_perso(admin.ModelAdmin):
def add_view(self, request, *args, **kwargs):
    result = super(Modeladmin_perso, self).add_view(request, *args, **kwargs )

   # Look at the referer for a query string '^.*\?.*$'
    ref = request.META.get('HTTP_REFERER', '')
    if ref.find('?') != -1:
        # We've got a query string, set the session value
        request.session['filtered'] =  ref

    if request.POST.has_key('_save'):
        """
        We only kick into action if we've saved and if
        there is a session key of 'filtered', then we
        delete the key.
        """
        try:
            if request.session['filtered'] is not None:
                result['Location'] = request.session['filtered']
                request.session['filtered'] = None
        except:
            pass
    return result
"""
Used to redirect users back to their filtered list of locations if there were any
"""
def change_view(self, request, object_id, extra_context={}):
    """
    save the referer of the page to return to the filtered
    change_list after saving the page
    """
    result = super(Modeladmin_perso, self).change_view(request, object_id, extra_context )

    # Look at the referer for a query string '^.*\?.*$'
    ref = request.META.get('HTTP_REFERER', '')
    if ref.find('?') != -1:
        # We've got a query string, set the session value
        request.session['filtered'] =  ref

    if request.POST.has_key('_save'):
        """
        We only kick into action if we've saved and if
        there is a session key of 'filtered', then we
        delete the key.
        """
        try:
            if request.session['filtered'] is not None:
                result['Location'] = request.session['filtered']
                request.session['filtered'] = None
        except:
            pass
    return result


0 commentaires

0
votes

Cette fonctionnalité a été une demande au projet Django depuis longtemps (le billet était ouvert il y a 5 ans).

Heureusement ce comportement ennuyeux était Correction dans le coffre. Attendez-vous à ce que cela soit inclus dans Django 1.6.


0 commentaires

3
votes

Cette fonctionnalité a été ajoutée à Django dans le cadre de la version 1.6 et est activée maintenant par défaut. Il est décrit dans le Notes de version :

Modeladmin conserve désormais les filtres sur la liste de la liste après la création, édition ou supprimer un objet. Il est possible de restaurer le précédent Comportement des filtres de nettoyage en définissant l'attribut SRESSE_FILTERS faux.


0 commentaires