我的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的管理功能。
答案 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)