在Inlineform中过滤Foreignkey

5 投票
1 回答
1918 浏览
提问于 2025-04-16 12:57

你好,我似乎无法在内联表单中对外键下拉框进行过滤。

这是我的类:

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 内联的书籍下拉框能够根据选定的作者进行过滤。但是我找不到怎么做。

如果能得到一些帮助就太好了。

1 个回答

7

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

你想要在内联表单中,作者下拉框只显示当前选中的作者,也就是说内联表单里永远只有一个选择,就是当前的作者,对吗?

通常情况下,你会用到 formfield_for_foreignkey 这个功能,具体可以参考这个链接:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

不过你这个情况比较特殊,因为每个内联表单都依赖于正在编辑的对象。

我没有找到简单的方法来访问正在编辑的对象,所以我把 formfield_for_foreignkey 的定义放在了 change_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)

撰写回答