Django admin inline with custom queryset

Обновить

November 2018

Просмотры

1.6k раз

2

У меня есть две модели:

class Parent:
   ...

class Child:
   parent = models.ForeignKey(Parent)

В модели админа Родитель Я хочу , чтобы показать встроенный в ребенка с настраиваемого QuerySet, а не только те , которые относятся к родителю через Fk поле.

Я пробовал:

class ChildInline(admin.TabularInline):
   model = Child
   def get_queryset(self, request):
      return Child.objects.filter(<my custom filter>)

class ParentAdmin(admin.ModelAdmin):
   inlines = [ChildInline]

Но все-таки единственные дети, указанные в инлайн являются те, которые FULLFILL оба фильтра: связанные с родителем на FK + мой пользовательский фильтр.

Можно ли сделать это?

РЕДАКТИРОВАТЬ:

Я видел, в настоящее время является BaseInlineFormSet, который фильтрование QuerySet я сочинить держать только Чайлдс, связанный с родителем, любая идея, как избежать этого?

django/forms/models.py

class BaseInlineFormSet(BaseModelFormSet):
    ...
    if self.instance.pk is not None:
       qs = queryset.filter(**{self.fk.name: self.instance})
    ...

1 ответы

2

Вы должны переопределить __init__()метод BaseInlineFormSet и обновить QuerySet их.

from django.forms.models import BaseInlineFormSet

class ChildInlineFormSet(BaseInlineFormSet):

    def __init__(self, *args, **kwargs):
        super(ChildInlineFormSet, self).__init__(*args, **kwargs)
        # Now we need to make a queryset to each field of each form inline
        self.queryset = Child.objects.filter(<my custom filter>)

Затем инициализируется formset атрибут с ChildInlineFormSet

class ChildInline(admin.TabularInline):
    model = Child
    formset = ChildInlineFormSet
    extra = 0