Django admin一对多及多对多内容过滤
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
基本就是这样,描述的有点乱,不过真正碰到类似问题的人,应该可以看明白。
有问题请留言一定尽力解答。
