Django - 如何在管理页面上的表格中的可编辑列中过滤ForeignKey选项?

时间:2014-02-23 18:31:00

标签: python django django-models django-forms django-admin

我的models.py中有以下内容:

class Size(models.Model):
    size = models.CharField(max_length=20, primary_key=True)

class Book(models.Model):
    title = models.CharField(max_length=100, primary_key=True)
    size = models.ForeignKey(Size, null=False)

class Pamphlet(models.Model):
    title = models.CharField(max_length=100, primary_key=True)
    size = models.ForeignKey(Size, null=False)
    book = models.ForeignKey(Book, null=True)

最初构建数据库时,将填充Size,Book和Pamphlet表,并且每个Book和Pamphlet都与单个大小相关联。但是,从Pamphlet到Book的外键没有设置。

用户有责任前往管理页面并选择与每本小册子关联的书籍。 Django的管理功能使得可以将显示的表格中的此列设置为可编辑,并且它足够智能,可以自动生成下拉选项,显示书籍表中的所有可能书籍供用户选择。

然而,这本书籍表包含数百种选择,我知道只有用户才能选择与小册子大小相同的书籍。所以我想过滤Django生成的下拉列表中的选项,只显示与Pamphlet共享相同大小的书籍。

我该如何做到这一点?

我看了一下:How do I filter ForeignKey choices in a Django ModelForm?但这似乎并不是指Django的管理功能。

1 个答案:

答案 0 :(得分:1)

专门管理admin的get_changelist_form方法以返回自定义表单类。该表单类可以根据其收到的queryset参数在其book方法中设置其__init__字段的instance属性。 EG:

class PamphletChangeListForm(forms.ModelForm):
    class Meta:
        model = Pamphlet

    def __init__(self, *args, **kwargs):
        super(PamphletChangeListForm, self).__init__(*args, **kwargs)
        instance = kwargs.get('instance')
        if instance:
            self.fields['book'].queryset = Book.objects.filter(size=instance__size)