Как отфильтровать списки страниц в администраторе трясогузки, чтобы редакторы видели только созданные ими страницы? - PullRequest
1 голос
/ 25 апреля 2019

Я создаю сайт трясогузки, где пользователи могут зарегистрироваться, войти в администратор трясогузки и написать страницы статей для публикации. Есть ли ловушка или возможный способ перехвата и фильтрации данных в администраторе трясогузки, чтобы пользователи могли видеть только те страницы статей, которые они сами создали?

Пока что я настроил регистрацию пользователей с помощью django-allauth, и пользователи могут успешно войти в систему. После регистрации получатель user_signed_up срабатывает, и пользователю назначается роль «Автор». В админке только автор имеет доступ к добавлению статей. Статьи - это приложение со страницей индекса статьи и страницей статьи (в основном это страница блога и страницы индекса блога). После того, как они войдут в систему, единственное, что они увидят, это вкладка Страницы слева, щелчок по которой приведет их в список «Статьи». Здесь они могут добавить страницу «Статья» и просмотреть созданные им статьи.

Это также, где моя проблема. На странице списка статей пользователи могут видеть все статьи, созданные всеми пользователями на сайте. Они могут редактировать только свои собственные, что замечательно, но в конечном итоге появятся сотни статей от других пользователей. Есть ли способ перехватить данные «Статьи» перед их отображением и отфильтровать их текущим пользователем?

В результате перехвата этих данных каждый пользователь, вошедший в систему администратора трясогузки, будет знать только те страницы статей, которые он создал.

Большое спасибо, я впервые использую трясогузку и до сих пор наслаждаюсь этим.

1 Ответ

2 голосов
/ 25 апреля 2019

Я нашел два разных решения этого вопроса.

  1. Реализация ModelAdmin для создания настраиваемого представления списка страниц вашей модели. Это позволяет вам создать совершенно новый пункт меню администратора и соответствующий вид списка. Этот метод более сложен, но предлагает больше контроля.
  2. Реализация construct_explorer_page_queryset административного хука для получения результатов по группам по группам. Этот метод быстр и прост в реализации и позволяет использовать существующий проводник Wagtails.

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

Метод 1: ModelAdmin

Использование ModelAdmin.get_queryset () и других полезных методов было найдено в Документах по трясогузке здесь .

Согласно этой странице в документах по трясогузке, я добавил ModelAdmin в INSTALLED_APPS:

# base.py settings

INSTALLED_APPS = [
    ...
    'wagtail.contrib.modeladmin',
]

Затем я создал файл с именем wagtail_hooks.py в своем приложении article. В этот файл я добавил код для создания моей страницы со списком статей в админке:

# wagtail_hooks.py

from wagtail.contrib.modeladmin.options import (ModelAdmin, modeladmin_register)
from .models import Article


class ArticleAdmin(ModelAdmin):
    model = Article
    menu_label = 'Articles'
    menu_icon = 'doc-full-inverse'
    menu_order = 000
    add_to_settings_menu = False
    exclude_from_explorer = False
    list_display = ('title', 'owner')
    search_fields = ('title', 'owner')

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        #only show articles from the current user
        return qs.filter(owner=request.user)


modeladmin_register(ArticleAdmin)

Они использовали здесь для реализации ModelAdmin.get_queryset () , который позволил мне отфильтровать владельца статей.

Вы также, вероятно, захотите удалить пункт меню Page explorer, поскольку он немного избыточен. Я также рекомендую реализовать метод 2 ниже. Даже если вы удалите пункт меню Page explorer, пользователь может попасть туда, введя URL-адрес непосредственно в браузере. Если они это сделают, реализация Метода 2 обеспечит не видеть контент, созданный другими пользователями.

Метод 2: construct_explorer_page_queryset @ hooks

Информация о хуке в документации Wagtail - construct_explorer_page_queryset Также упоминается эта статья в группах Google - https://groups.google.com/forum/#!topic/wagtail/10tcq8PB8io

В тот же файл wagtail_hooks.py, который я создал выше, я добавил этот код:

@hooks.register('construct_explorer_page_queryset')
def show_authors_only_their_articles(parent_page, pages, request):
    user_group = request.user.groups.filter(name='Author').exists()
    if user_group:
        pages = pages.filter(owner=request.user)

    return pages

Вот и все для второго метода.

...