在Inlineform中过滤Foreignkey
你好,我似乎无法在内联表单中对外键下拉框进行过滤。
这是我的类:
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)