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

标签 python django django-admin

有 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/

相关文章:

Python 数据帧时间增量

python - 从现有模型中分解出新模型时创建迁移

python - 如果celery broker未运行,则Django测试会随机卡住

python - Django Admin - 从添加/编辑组页面上的列表中删除权限

google-app-engine - Django-nonrel 无法以 super 用户身份登录本地主机管理站点

Django 管理自定义模板标签

python - 如何刷新 sys.path?

python - 将连续数据转换为 Pandas 数据框中的分类数据

python - Django 项目中的网络摄像头流

python - Matplotlib 在图中填充空白