【问题标题】:How to filter filter_horizontal in Django admin?如何在 Django 管理员中过滤 filter_horizo​​ntal?
【发布时间】:2014-05-23 00:20:26
【问题描述】:

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

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

在 models.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_horizo​​ntal 的左侧以仅显示特定项目?

【问题讨论】:

标签: python django django-admin


【解决方案1】:

老问题,但无论如何:

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

根据Django docs,这个属性

设置此字段的可用选项限制 使用ModelForm 或管理员呈现...

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

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 标志,但也可以使用更复杂的查询。

【讨论】:

    【解决方案2】:

    我找到了一个解决方案,方法是调整我在 Google Groups 中找到的另一个问题的答案

    它可以像这样与自定义 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',) 
    

    希望这可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 2011-02-15
      • 2011-07-17
      • 2013-01-27
      • 2019-08-15
      • 1970-01-01
      • 2013-08-12
      • 2015-09-08
      • 1970-01-01
      • 2012-01-31
      相关资源
      最近更新 更多