Django admin一对多及多对多内容过滤

2010-04-17 23:11:24 by sand, 954 visits, Tags: admin, Python, Django,

Django中admin是内置集成的管理后台,其中多对多及多对一关联有一个参数 limit_choices_to用来限制表单中的对应选项

目前可用的值只能是静态的例如:

limit_choices_to={'type':0}

代表限制只显示type=0的内容

假如碰到高级的过滤,例如我想只显示type和本对象type相等的,就没办法实现了,例如:

limit_choices_to={'type':self.type}是不可行的,因为这个代码是在类定义里,是没有self定义的
报错为:NameError: name 'self' is not defined

也许有人会想到用'self'.type,就类似自关联那种models.ForeignKey('self'),实际上这也是不行的
报错为:AttributeError: 'str' object has no attribute 'type',python把'self'当成普通字符串对象处理了

下面介绍一种可以达到你想要效果的办法,自定义表单:

代码大概的意思就是定义了Menu对象,并和自己关联,代表菜单可以有自己的上级菜单,但是在form里做了限制,在admin管理编辑页面中选择上级时将看不到自己,因为自己不能作为自己的上级
过滤目标对象id不等于当前对象id

class Menu(models.Model): title = models.CharField('title', max_length=50, unique=True)
    parentMenu = models.ForeignKey('self', verbose_name='parent menu',blank=True, null=True)

class MenuForm(forms.ModelForm): def __init__(self, *args, **kwargs):
        super(MenuForm, self).__init__(*args, **kwargs) if'instance'in kwargs:
            self.fields['parentMenu'].queryset = Menu.objects.exclude(id=kwargs['instance'].id)
class MenuAdmin(admin.ModelAdmin):
    model = Menu
     form=MenuForm
 

基本就是这样,描述的有点乱,不过真正碰到类似问题的人,应该可以看明白。

有问题请留言一定尽力解答。

 

相关评论 | Comments (2)

  1. Eliseo says: 2010-06-13 12:56:18
    额,看的明白。 但是我遇到的问题更麻烦,不知道怎么样套用这个做法。 总是有点启发的。我得好好理下思路。 多谢分享。
  2. wl6179 says: 2012-03-21 16:13:46
    嗯我也明白了,10000分谢谢!!留个名~~~嘿嘿~

发表评论

用户名(required)

验证码(required)

Email(不会显示在网页)(required)

您的站点