我的 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)
最初构建数据库时,会填充尺寸、书籍和小册子表,并且每本书和小册子都与单个尺寸相关联。但是,从 Pamphlet 到 Book 的外键尚未设置。
用户有责任转到管理页面并选择与每本小册子关联的书籍。 Django 的管理功能可以将显示的表中的该列设置为可编辑,并且它足够智能,可以自动生成一个下拉选项,显示书籍表中所有可能的书籍供用户选择。
但是,这个书籍表包含数百种选择,我知道用户只有选择一本与小册子大小相同的书籍才有意义。因此,我想过滤 Django 生成的下拉列表中的选项,只显示与 Pamphlet 大小相同的书籍。
我怎样才能做到这一点?
我看这里:How do I filter ForeignKey choices in a Django ModelForm?但这似乎并不是指 Django 的管理功能。
最佳答案
专门化 get_changelist_form
管理员的方法返回自定义表单类。该表单类可以在其 __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)
关于python - Django - 如何过滤管理页面表中可编辑列中的外键选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21972594/