python - Django - 如何过滤管理页面表中可编辑列中的外键选择?

标签 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)

最初构建数据库时,会填充尺寸、书籍和小册子表,并且每本书和小册子都与单个尺寸相关联。但是,从 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/

相关文章:

python - Django 模型同步表

Python 列表复制 - 困惑

python - 使用多级 Pandas Dataframe 的 Seaborn Plot 时遇到问题

python - 根据更改权限更新django中的readonly_fields

python - 使用索引 1D 数组切片 2D 数组

python - Django:从模板中的表单小部件访问模型字段

python - 可以在 wsgi 应用程序中生成线程吗?

django - 使用自定义用户模型创建 super 用户后无法登录到 django admin

Django Rest Framework 在创建记录后设置一个只读字段

python - 继承模型元类的正确语法?