开发者

How to preserve filter selection after save in Django Admin

First, I did look at this question, but its over a year old. Surely now there is a good way in Django 1.1.1 to carry filter selection forward after a user clicks th开发者_运维知识库e save button in the Admin.

In a table with thousands of records, filtering is essential. And if a user makes several filter choices that effort shouldn't have to be repeated.


The answer is still the same: out of the box, Django doesn't support this behavior. There are a couple of tickets in the issue tracker with patches: #3777, #6903. The middleware class in this comment works without modifying Django code.


This feature has been added to Django as part of the 1.6 release and is enabled now by default. It is described in the release notes:

ModelAdmin now preserves filters on the list view after creating, editing or deleting an object. It’s possible to restore the previous behavior of clearing filters by setting the preserve_filters attribute to False.


another way is to use this snippet 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

the good thing is you don't have to hack anything.


This feature has been a request to the Django project for a long time (the ticket was opened 5 years ago).

Fortunately this annoying behavior was fixed in trunk. Expect it to be included in Django 1.6.


Here's what I did inside render_change_form to generate a back button with preserved_filters.

def generate_back_url(self, request):
    opts = self.model._meta
    post_url = reverse(
        "admin:%s_%s_changelist" % (opts.app_label, opts.model_name),
        current_app=self.admin_site.name,
    )
    preserved_filters = self.get_preserved_filters(request)
    return add_preserved_filters(
        {"preserved_filters": preserved_filters, "opts": opts}, post_url
    )
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜