如何在 Django 管理中过滤 filter_horizontal?

新手上路,请多包涵

我正在寻找一种在过滤查询集的基础上使用 filter_horizontal 的方法。

我尝试将它与自定义管理器一起使用:

在模型.py 中:

 class AvailEquipManager(models.Manager):
    def get_query_set(self):
        return super(AvailEquipManager, self).get_query_set().filter(id=3)

class Equipment(models.Model):
    description = models.CharField(max_length=50)
    manufacturer = models.ForeignKey(Manufacturer)
    [...]
    objects = models.Manager()
    avail = AvailEquipManager()

    def __unicode__(self):
        return u"%s" % (self.description)

在 admin.py 中:

 class SystemAdmin(admin.ModelAdmin):
    filter_horizontal = ('equipment',) # this works but obviously shows all entries
    #filter_horizontal = ('avail',)     # this does not work

所以问题是,如何减少 filter_horizontal 的左侧以仅显示特定项目?

原文由 normic 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

我通过调整我在 Google 网上论坛 中找到的不同问题的答案找到了解决方案

它与自定义 ModelForm 一起工作,如下所示:

新建一个forms.py:

 from django import forms
from models import Equipment

class EquipmentModelForm(forms.ModelForm):
    class Meta:
        model = Equipment

    def __init__(self, *args, **kwargs):
        forms.ModelForm.__init__(self, *args, **kwargs)
        self.fields['equipment'].queryset = Equipment.avail.all()

然后在 admin.py 中:

 class SystemAdmin(admin.ModelAdmin):
    form = EquipmentModelForm
    filter_horizontal = ('equipment',)

希望这有时能帮助别人。

原文由 normic 发布,翻译遵循 CC BY-SA 3.0 许可协议

老问题,但无论如何:

根据您的具体要求,在 equipment 关系字段上设置 limit_choices_to 属性可能更容易。这适用于 ForeignKey 字段以及 ManyToManyField s。

根据 Django 文档,这个属性

当使用 ModelForm 或 admin …

一个最小的例子,假设你有一个 System 模型与 equipment 多对多字段:

 class Equipment(models.Model):
    available = models.BooleanField(default=True)

class System(models.Model):
    equipment = models.ManyToManyField(to=Equipment,
                                       limit_choices_to={'available': True})

class SystemAdmin(admin.ModelAdmin):
    filter_horizontal = ['equipment']

这使用了 available 标志,但也可以使用更复杂的查询。

原文由 djvg 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题