Фильтр Queryset в Wagtail ModelAdmin не работает - PullRequest
1 голос
/ 30 мая 2019

У меня есть пункт меню, который содержит 4 ресурса, каждый язык, если пользователь переходит на EnResources, я бы хотел, чтобы он отображал только ресурсы, в которых поле языка содержит «en» и то же самое с другими языками. Таким образом, проблема в том, что он получает только элементы en, независимо от того, какой пункт меню я выбираю, это всегда элементы en, а не FrResources или что-то еще.

Я следую за документами http://docs.wagtail.io/en/v2.5.1/reference/contrib/modeladmin/indexview.html#modeladmin-get-queryset

Models.py

class Resource(models.Model):
    language = models.CharField(max_length=255, choices=constants.LANGUAGES)
    title = models.CharField(blank=True, max_length=255)
    resource_type = models.CharField(
        choices=constants.RESOURCE_TYPES,
        max_length=255
    )
    description =  models.TextField()
    link = StreamField(
        blocks.BasicLinkBlock(max_num=1),
        blank=True,
    )


    panels = [
        FieldPanel('language'),
        FieldPanel('title'),
        FieldPanel('resource_type'),
        FieldPanel('description'),
        StreamFieldPanel('link'),
    ]

constants.py

RESOURCE_TYPES = (
    ('Documentation', 'Documentation'),
    ('Whitepaper', 'Whitepaper'),
    ('Webinar', 'Webinar'),
    ('Video', 'Video'),
    ('Testimonial', 'Testimonial'),
    ('ProductSheet', 'ProductSheet'),
)

LANGUAGES = (
    ('en', 'English'),
    ('fr', 'French'),
    ('be-fr', 'Belgique'),
    ('be-nl', 'Nederlands'),
)

WagtailHooks.py

class ResourceAdmin(ModelAdmin):
    model = models.Resource
    menu_label = 'Resources'
    menu_icon = 'snippet'  # change as required
    list_display = (
        'resource_type',
        'title',
    )
    list_filter = (
        'resource_type',
    )
    search_fields = (
        'title',
        'business_email',
    )

class EnResourceAdmin(ResourceAdmin):
    menu_label = 'English Resources'

    def get_queryset(self, request):

        qs = super().get_queryset(request)
        return qs.filter(language='en')


class FrResourceAdmin(ResourceAdmin):
    menu_label = 'French Resources'

    def get_queryset(self, request):
        qs = super().get_queryset(request)

        return qs.filter(language='fr')


class BeResourceAdmin(ResourceAdmin):
    menu_label = 'Belgium Resources'
    def get_queryset(self, request):
        qs = super().get_queryset(request)

        return qs.filter(language='be-fr')


class NlResourceAdmin(ResourceAdmin):
    menu_label = 'Nederlands Resources'

    def get_queryset(self, request):
        qs = super().get_queryset(request)

        return qs.filter(language='be-nl')


class ResourceAdminGroup(ModelAdminGroup):
    menu_label = 'Resources'
    menu_icon = 'snippet'  # change as required
    menu_order = 1000  # (000 being 1st, 100 2nd)
    items = (
        EnResourceAdmin,
        FrResourceAdmin,
        BeResourceAdmin,
        NlResourceAdmin,
    )

modeladmin_register(ResourceAdminGroup)

EDIT: Я начал проводить немного больше исследований и обнаружил, что в соответствии с Django документами по умолчанию_manager. https://docs.djangoproject.com/en/2.2/topics/db/managers/#django.db.models.Model._default_manager

Если вы используете пользовательские объекты диспетчера, обратите внимание, что первый диспетчер Встречи с Джанго (в порядке, в котором они определены в модели) имеет особый статус. Джанго интерпретирует первый менеджер, определенный в класс в качестве менеджера «по умолчанию» и несколько частей Django (включая dumpdata) будет использовать этот менеджер исключительно для этой модели. Как В результате, по умолчанию следует соблюдать осторожность при выборе значения по умолчанию. менеджер, чтобы избежать ситуации, когда переопределение get_queryset () приводит к невозможности получения объектов, с которыми вы хотели бы работать.

Вы можете указать собственный менеджер по умолчанию, используя Meta.default_manager_name.

Если вы пишете код, который должен обрабатывать неизвестную модель, для Например, в стороннем приложении, которое реализует универсальное представление, используйте это менеджер (или _base_manager), а не предполагать, что модель имеет менеджер объектов.

Обратите внимание на последнюю часть первого абзаца. Я думаю, что это именно то, что здесь происходит.

...