在内联表单中过滤外键

时间:2011-03-03 19:55:05

标签: python django django-admin

您好我似乎无法在内联表单中过滤外键下拉列表。

这些是我的课程:

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 个答案:

答案 0 :(得分:7)

我对你的问题感到有些困惑,但发现它很有趣。

您希望作者的内联下拉列表成为所选作者 - 因此内联将始终只有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中,并在视图函数中分配了内联。

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)
相关问题