Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django admin中过滤水平过滤器?_Python_Django_Django Admin - Fatal编程技术网

Python 如何在Django admin中过滤水平过滤器?

Python 如何在Django admin中过滤水平过滤器?,python,django,django-admin,Python,Django,Django Admin,我正在寻找一种在过滤查询集的基础上使用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): descr

我正在寻找一种在过滤查询集的基础上使用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)
class SystemAdmin(admin.ModelAdmin):
    filter_horizontal = ('equipment',) # this works but obviously shows all entries
    #filter_horizontal = ('avail',)     # this does not work
在admin.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)
class SystemAdmin(admin.ModelAdmin):
    filter_horizontal = ('equipment',) # this works but obviously shows all entries
    #filter_horizontal = ('avail',)     # this does not work

因此,问题是,如何将过滤器的左侧水平缩小,以仅显示特定的项目?

我找到了一个解决方案,将答案调整为我在中找到的不同问题

它与自定义模型表单一起工作,如下所示:

创建一个新的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',) 

希望这有助于其他人解决问题。

老问题,但无论如何:

根据您的具体要求,在
设备
关系字段中将
限制选项设置为
属性可能更容易。这适用于
ForeignKey
字段以及
ManyToManyField
s

根据"基本法",

当此字段被删除时,设置此字段可用选项的限制 使用
模型形式
或管理员

一个最简单的例子,假设您有一个带有
设备的
系统
模型
多对多字段:

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