社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  问与答

[精华] 请问一下,model中的ManyToManyFields,在admin中怎么筛选数据?

hls_hh • 11 年前 • 11502 次点击  

大家好,请教大家一个问题, 我在model中定义有这样定义

class Equipment(models.Model):
    pid = models.CharField(max_length=32, blank=False, verbose_name=_(u'PID'))
    type = models.ForeignKey(EquipmentType, blank=False, verbose_name=_(u'设备类型'))
    area = models.ManyToManyField(Area, blank=False, verbose_name=_(u'设备区域'))
    mac = models.CharField(max_length=32, blank=False, verbose_name=_(u'MAC'))

class Meta:
    verbose_name = _(u'设备信息')
    verbose_name_plural = verbose_name

def __unicode__(self):
     return _(u'设备:%(pid)s') % {'pid':self.pid}

这样我在使用admin中添加数据的时候,会将Area中的数据列出来,供我选择,但现在的情况是,我需要根据用户的权限,去判断,只显示Area中的部分数据。我理解的admin.py中添加queryset(如下面程序),是用来筛选整个 Equipment的,

 def queryset(self):
    qs = super(UserAreaPermissionAdmin,self).queryset()
    if self.request.user.is_superuser:
        return qs
    else:
        return qs.filter(user = self.request.user)

但我现在需要的是admin界面中添加Equipment的时候,界面中提供的area选项,是我筛选过的,不知道在哪里设置,请大家指教,谢谢!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/100
 
11502 次点击  
文章 [ 7 ]  |  最新文章 11 年前
一休哥
Reply   •   1 楼
一休哥    11 年前

@indexofire :这回复,等得花儿也谢了~

hls_hh
Reply   •   2 楼
hls_hh    11 年前

谢谢各位,谢谢 @indexofire ,用这个方法实现了过滤的效果,谢谢。

indexofire
Reply   •   3 楼
indexofire    11 年前

@hls_hh 你是想直接将admin作为前台输入界面了吧?如果不需要object permission那就比较简单:

class EquipmentAdmin(admin.ModelAdmin):
    """ M2M field db field for Area """

    def _filter_your_area(self, request, perm=None):
        #do_some_check and return queryset of area.
        ...

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        # use your area field name here
        if db_field.name == 'area':
            kwargs['queryset'] = self._filter_your_area()

        return super(EquimentAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)
paomian
Reply   •   4 楼
paomian    11 年前

请看这里 enter link description here

在is_admin那里应该是个示例

hls_hh
Reply   •   5 楼
hls_hh    11 年前

@indexofire 你好,谢谢回答,我理解的queryset方法是查询整个Equipment的,就是筛选的是符合条件的Equipment,但现在我需要的是在编辑或添加新的Equipment的时候,根据用户的不同,只显示部分的Area待选项。不知道我理解的queryset对不对,请指教,谢谢。object permission应该是个思路,但我最初想的是只要在显示Area的时候筛选一下就行,不知道能不能实现。

indexofire
Reply   •   6 楼
indexofire    11 年前

不知道我理解的对不对,不知道你的permission需求是否是object permission。

你可能需要自己写个继承admin.ModelAdmin的class,给queryset方法添加一些筛选,具体可能还是看你对权限的需求模式吧。

Py站长
Reply   •   7 楼
Py站长    11 年前

这个我没搞过,顶一下,有谁做过的帮忙 回答一下哈