Фильтр Foreignkey внутри Inlineform - PullRequest
5 голосов
/ 03 марта 2011

Здравствуйте, я не могу отфильтровать выпадающий список 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 голосов
/ 04 марта 2011

Я немного смущен вашим вопросом, но нашел его интересным.

Вы хотите, чтобы раскрывающийся список авторов в строках был выбранным автором - поэтому в строке всегда будет только 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...