Py学习  »  问与答

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

hls_hh • 10 年前 • 10823 次点击  

大家好,请教大家一个问题, 我在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
 
10823 次点击  
文章 [ 7 ]  |  最新文章 10 年前
一休哥
Reply   •   1 楼
一休哥    10 年前

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

hls_hh
Reply   •   2 楼
hls_hh    10 年前

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

indexofire
Reply   •   3 楼
indexofire    10 年前

@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    10 年前

请看这里 enter link description here

在is_admin那里应该是个示例

hls_hh
Reply   •   5 楼
hls_hh    10 年前

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

indexofire
Reply   •   6 楼
indexofire    10 年前

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

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

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

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