zoukankan      html  css  js  c++  java
  • xadmin 自定义过滤器选项

    默认过滤器会把所有的店铺都显示出来,如果店铺很多筛选会很不方便。我希望可以根据每个用户的权限不同来显示他们店铺

    1.找到过滤器源码修改

    地址:xadmin/filters.py

    # 这是ForeignKey过滤字段的处理类,其他字段可能不是这个类
    @manager.register
    class RelatedFieldListFilter(ListFieldFilter):
    
        @classmethod
        def test(cls, field, request, params, model, admin_view, field_path):
            return is_related_field2(field)
    
        def __init__(self, field, request, params, model, model_admin, field_path):
            other_model = get_model_from_relation(field)
            if hasattr(field, 'remote_field'):
                rel_name = field.remote_field.get_related_field().name
            else:
                rel_name = other_model._meta.pk.name
    
            self.lookup_formats = {'in': '%%s__%s__in' % rel_name, 'exact': '%%s__%s__exact' %
                                                                            rel_name, 'isnull': '%s__isnull'}
            # 添加这一段代码
            if hasattr(model_admin,'{field}_choices'.format(field=field.name)):
                self.lookup_choices = getattr(model_admin,'{field}_choices'.format(field=field.name))(field, request, params, model, model_admin, field_path)
            else:
                self.lookup_choices = field.get_choices(include_blank=False)
            # 添加结束
            super(RelatedFieldListFilter, self).__init__(
                field, request, params, model, model_admin, field_path)
    
            if hasattr(field, 'verbose_name'):
                self.lookup_title = field.verbose_name
            else:
                self.lookup_title = other_model._meta.verbose_name
            self.title = self.lookup_title

    2.在ModelAdmin中添加方法

        def store_choices(self, field, request, params, model, model_admin, field_path):
            
            # 如果是超级用户不做控制
            if self.request.user.is_superuser:
                return field.get_choices(include_blank=False)
    
            # 这里就是自己写条件,从数据库中查询出需要显示的店铺
            store_lst = self.get_query_set(model.objects).values('store__title').distinct().order_by('store__title')
            # 返回格式 [('pk','标题'),]
            return list(((store.get('store__title'), store.get('store__title')) for store in store_lst))
  • 相关阅读:
    [转]Android Uri Intent 用法汇总
    [书目20120607]编写高质量代码:改善C#程序的157个建议
    [转]Android多媒体:实现图像的编辑和合成
    [转]Android IPC进程通信——Messager方式
    [转]Android中程序与Service交互的方式——交互方式
    [书目20120605]人力资源管理 余凯成
    [转]SurfaceView horizontal scrolling
    住房乃生活所需
    [转]android service 学习(上) 音乐播放
    [转]Android实现获取本机中所有图片
  • 原文地址:https://www.cnblogs.com/wtil/p/12705051.html
Copyright © 2011-2022 走看看