gpt4 book ai didi

python - Django 管理,通过 ManyToMany 引用过滤对象

转载 作者:行者123 更新时间:2023-12-01 06:16:33 30 4
gpt4 key购买 nike

有 photologue 应用程序,django 的简单照片库,实现照片和图库对象。Gallery 对象有 ManyToMany 字段,该字段引用 Photo 对象。

我需要能够获取给定图库的所有照片列表。是否可以将图库过滤器添加到照片的管理页面?如果可以的话,如何做到最好?

最佳答案

您需要编写一个自定义 FilterSpec! Custom Filter in Django Admin on Django 1.3 or below
它看起来像这样:

from django.contrib.admin.filterspecs import RelatedFilterSpec, FilterSpec
from models import Gallery

class GalleryFilterSpec(RelatedFilterSpec):
def __init__(self, f, request, params, model, model_admin):
self.lookup_kwarg = f.name
self._lookup_model = f.rel.to
self.lookup_val = request.GET.get(self.lookup_kwarg, None)
self.user = request.user
self.lookup_choices = [(g.pk, g.name) for g in Gallery.objects.all()]

def has_output(self):
return len(self.lookup_choices) > 1

def title(self):
return self._lookup_model._meta.verbose_name

FilterSpec.filter_specs.insert(0,
(lambda f: f.rel.to == Gallery, GalleryFilterSpec))

将其放入应用程序包中的模块 filters.py 中,并将其导入到 admin.py 中(导入它很重要,以便过滤器注册在管理网站上!)

编辑:“f”是字段实例,在本例中models.ManyToManyField 最后一行注册与 Gallery 模型相关的所有字段的 FilterSpec。如果该字段是在 Gallery 模型上定义的,则这将不起作用,因为 django.contrib.admin.views.main.ChangeList.get_filters 会检查您在列表中定义的字段是否确实存在于模型(也不适用于 related_name)。我认为最简单的方法是,您可以为该更改列表创建一个自定义模板,并在其中硬编码您的过滤器,FilterSpec 本身不需要过滤本身,django 仅使用 url 获取参数!

关于python - Django 管理,通过 ManyToMany 引用过滤对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3036680/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com