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

2024-09-27 23:15:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我的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都与一个大小相关联。但是,没有设置从小册子到书本的外键。在

这将是一个用户的责任去管理页,并选择哪本书与每本小册子相关联。Django的管理功能可以将显示的表中的此列设置为可编辑的,并且它足够智能,可以自动生成一个下拉选项,显示books表中所有可能的图书,供用户选择。在

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

我怎样才能做到这一点?在

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


Tags: djangokeytruesizemodelmodelslengthmax
1条回答
网友
1楼 · 发布于 2024-09-27 23:15:45

专门化admin的^{}方法以返回自定义窗体类。该表单类可以在其__init__方法中设置其book字段的queryset属性,具体取决于它接收到的instance参数。例如:

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)

相关问题 更多 >

    热门问题