【问题标题】:Creating custom list filter in django在 django 中创建自定义列表过滤器
【发布时间】:2013-04-03 16:27:57
【问题描述】:

我正在扩展 ListFilter 以在 Django 1.4 中为 Django Admin 创建一个自定义 ListFilter,但 django 会自动将我的查询字符串参数转换为 e=1。有什么办法可以告诉 Django 管理员允许某些参数;而不是将它们转换为 e=1。

这是我的自定义 ListFilter:

class DateRangeListFilter(ListFilter):
    """ Custom Date Range Filter using Jquery UI for date-picker """
    title = _('date range')
    template = 'admin/filter_date.html'

    parameters = ['class_after', 'class_before']
    parameter_friendly_names = {parameters[0]: 'Class After', parameters[1]: 'Class Before'}
    parameter_values = {}
    parameter_name = parameters[0]
    used_parameters = {parameters[0]: '', parameters[1]: ''}

    def __init__(self, request, params, model, model_admin):
        super(ListFilter, self).__init__()

        for parameter in self.parameters:
            value = request.GET.get(parameter, None)
            if value:
                self.parameter_values[parameter] = value

        self.lookup_choices = list(self.lookups())

    def has_output(self):
        return len(self.lookup_choices) > 0

    def lookups(self, *args):
        lookup_list = []
        for key in self.parameters:
            lookup_list.append((key, self.parameter_friendly_names[key]))
        return lookup_list

    def expected_parameters(self):
        return self.parameters

    def queryset(self, request, queryset):
        return queryset

    def choices(self, cl):
        for lookup, title in self.lookup_choices:
            param_name = title
            replace_text = 'gte_icdate' if title == self.parameters[0] else 'lte_icdate'
            value = self.parameter_values[lookup] if self.parameter_values.has_key(lookup) else ''
            yield {
                'param_name': param_name,
                'selected': True if lookup is not None else False,
                'query_string': cl.get_query_string({param_name: replace_text, }, []),
                'value': value,
                'display': title,
                'replace_text': replace_text,
                }

【问题讨论】:

    标签: django django-admin-filters


    【解决方案1】:

    Django 有时太神奇了。几乎可以肯定有一种正确的方法可以做到这一点,而我正在做的可能不是。但是我修改了我的 init 函数以从字典中删除我的特殊参数;因此 django 管理员忽略了它。

    def __init__(self, request, params, model, model_admin):
        super(ListFilter, self).__init__()
    
        for param_key in self.parameters: 
            if param_key in params.keys():
                self.parameter_values[param_key] = params[param_key]
                del params[param_key]  # This is the anti-magic line
            else:
                self.parameter_values[param_key] = ''
    
        self.lookup_choices = list(self.lookups())
    

    【讨论】:

      【解决方案2】:

      我确实看到了这种情况:看来您需要为视图保留一组“干净”的参数。 我已经看到 pop() 被用作更有效的替代方法:

      def __init__(self, request, params, model, model_admin):
          super(ListFilter, self).__init__()
      
          for param_key in self.parameters:
              self.parameter_values[param_key] = params.pop(param_key,'')
      
          self.lookup_choices = list(self.lookups())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-19
        • 2019-04-04
        • 2011-01-06
        • 2015-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-16
        相关资源
        最近更新 更多