【问题标题】:How to preserve filter selection after save in Django Admin在 Django Admin 中保存后如何保留过滤器选择
【发布时间】:2009-12-29 20:09:20
【问题描述】:

首先,我确实看过这个question,但它已经有一年多了。当然,现在 Django 1.1.1 中有一个好方法可以在用户单击 Admin 中的保存按钮后继续进行过滤器选择。

在包含数千条记录的表中,过滤是必不可少的。如果用户做出多个过滤器选择,则不必重复该努力。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    答案还是一样:开箱即用,Django 不支持这种行为。问题跟踪器中有几张带有补丁的票:#3777#6903this comment 中的中间件类无需修改 Django 代码即可工作。

    【讨论】:

    • 我喜欢中间件解决方案。谢谢!
    • 太好了,为我的用户解决了一个大问题!那个补丁已经放了 6 年了……
    【解决方案2】:

    此功能已作为 1.6 版本的一部分添加到 Django,现在默认启用。在release notes中有描述:

    ModelAdmin 现在在创建后保留列表视图中的过滤器, 编辑或删除对象。可以恢复以前的 通过设置 preserve_filters 属性清除过滤器的行为 为假。

    【讨论】:

      【解决方案3】:

      另一种方法是使用这个sn-p 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
      

      好处是你不必破解任何东西。

      【讨论】:

        【解决方案4】:

        这个功能是对Django项目的一个请求很久了(ticket是5年前开通的)。

        幸运的是,这种烦人的行为是在后备箱中的fixed。预计它将包含在 Django 1.6 中。

        【讨论】:

          猜你喜欢
          • 2010-09-15
          • 2016-09-21
          • 1970-01-01
          • 1970-01-01
          • 2015-07-11
          • 2021-08-26
          • 2016-05-11
          • 2010-10-15
          • 2022-01-23
          相关资源
          最近更新 更多