python - 在 Inlineform 中过滤外键

标签 python django django-admin

您好,我似乎无法过滤内嵌表单中的外键下拉列表。

这些是我的类(class):

class Author(models.Model):
    name = models.CharField(max_length=50)
    desc = models.CharField(max_length=50)

class Book(models.Model):
    author = models.ForeignKey(Author)
    title= models.CharField(max_length=50)

class BookPrio::
    author = models.ForeignKey(Author)
    book = models.ForeignKey(Book)
    prio = models.IntegerField()

我的 admin.py 看起来像:

class BookPrioInline(admin.TabularInline):
    model = BookPrio

class AuthorAdmin(admin.ModelAdmin):
    inlines =(BookPrioInline,)

admin.site.register(Author, AuthorAdmin)

我希望 BookPrio 内嵌的 Books 下拉菜单根据管理面板中的选定作者进行过滤。但是无法找到如何去做。

欢迎提供帮助

最佳答案

我对你的问题有点困惑,但觉得它很有趣。

您希望内联上的作者下拉列表成为所选作者——这样内联将始终只有 1 个选择,即当前作者?

嗯,通常你会使用 formfield_for_foreignkey http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

但是您有一个特殊情况,其中每个内联都取决于正在编辑的对象。

我没有看到任何访问编辑对象的简单方法,所以我将 formfield_for_foreignkey 定义放在 change_view 中,并从 View 函数中分配内联。

class BookPrioInline(admin.TabularInline):
    model = BookPrio

class AuthorAdmin(admin.ModelAdmin):
    inlines = (BookPrioInline,)

    def change_view(self, request, object_id, extra_context=None):
          def formfield_for_foreignkey(self, db_field, request, **kwargs):
              if db_field.name == 'book':
                  kwargs['queryset'] = Book.objects.filter(author__id=object_id)
              return super(ItemInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

          ItemInline.formfield_for_foreignkey = formfield_for_foreignkey

          self.inline_instances = [ItemInline(self.model, self.admin_site)]

          return super(AuthorAdmin, self).change_view(request, object_id,
              extra_context=extra_context)


admin.site.register(Author, AuthorAdmin)

关于python - 在 Inlineform 中过滤外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5185808/

相关文章:

python - Pandas :value_counts 函数的反函数

python - 数值错误

python - 通过 python 在 Azure DevOps 中创建工作项

django - 模块未找到错误 : No module named 'polls'

Django 标记和 Django 管理

python - 如何在 form_valid 中获取对象 ID?

python - Django - 减少 View 中重复的上下文代码

python - 从 imagekit.models 导入 ImageSpecField ImportError : No module named 'imagekit.models'

python - 如何在 Django 中实现客户端管理?

python - 如何避免 Django 1.9.2 中的 admin.E111 错误?