Spec-Zone.ru › Wagtail

Обратный поиск URL-адресов ModelAdmin

Иногда полезно получить URL-адреса index (списка) или create для модели вместе с URL-адресом edit, delete или inspect для конкретного объекта в модели, зарегистрированной с помощью приложения modeladmin.

Сам Wagtail делает это, создавая экземпляр каждого класса ModelAdmin, который вы зарегистрировали, и используя атрибут url_helper каждого экземпляра для определения этих URL-адресов.

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

Ниже приведены некоторые примеры:

  • Получение URL-адресов edit или delete или inspect для объекта
  • Получение URL-адресов index или create для модели

Получение URL-адресов edit или delete или inspect для объекта

В этом примере мы предоставим быстрый способ edit автора, связанного с записью в блоге, из меню списка на странице администрирования. Мы определили класс AuthorModelAdmin и зарегистрировали его в Wagtail, чтобы Author объекты можно было администрировать через область администратора. Модель BlogPage имеет поле author (ссылка на модель Author) для указания одного автора для каждой записи.

    # file: wagtail_hooks.py

    from wagtail.admin.widgets import PageListingButton
    from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
    from wagtail import hooks

    # Author & BlogPage model not shown in this example
    from models import Author

    # ensure our modeladmin is created
    class AuthorModelAdmin(ModelAdmin):
        model = Author
        menu_order = 200

    # Creating an instance of `AuthorModelAdmin`
    author_modeladmin = AuthorModelAdmin()

    @hooks.register('register_page_listing_buttons')
    def add_author_edit_buttons(page, page_perms, next_url=None):
        """
        For pages that have an author, add an additional button to the page listing,
        linking to the 'edit' page for that author.
        """
        author_id = getattr(page, 'author_id', None)
        if author_id:
            # the url helper will return something like: /admin/my-app/author/edit/2/
            author_edit_url = author_modeladmin.url_helper.get_action_url('edit', author_id)
            yield PageListingButton('Edit Author',  author_edit_url, priority=10)

    modeladmin_register(AuthorModelAdmin)

Как видно из примера выше, при использовании get_action_url() для генерации URL-адресов, относящихся к объекту, необходимо предоставить значение первичного ключа целевого объекта, чтобы оно могло быть включено в результирующий URL-адрес (например, "/admin/my-app/author/edit/2/"). Следующие имена действий для конкретных объектов поддерживаются get_action_url():

  • 'edit' Возвращает URL-адрес для обновления конкретного объекта.
  • 'delete' Возвращает URL-адрес для удаления конкретного объекта.
  • 'inspect' Возвращает URL-адрес для просмотра деталей конкретного объекта.

    • ПРИМЕЧАНИЕ: Это будет работать только в том случае, если inspect_view_enabled установлено в True для вашего класса ModelAdmin.

Примечание

Если вы используете строковые значения в качестве первичных ключей для модели, вам может потребоваться обработать случаи, когда ключ содержит символы, которые не являются безопасными для URL. Безопасными являются только символы из набора букв, цифр ([0-9a-zA-Z]) или следующие специальные символы: $, -, _, ., +, !, *, ', (, ).

django.contrib.admin.utils.quote() можно использовать для безопасного кодирования этих значений первичных ключей перед их передачей в get_action_url(). Если этого не сделать, Wagtail может не распознать первичный ключ при посещении URL-адреса, что приведет к ошибкам 404.

Получение URL-адресов index или create для модели

Доступны URL-адреса для представления списка модели (действие 'index') и представления создания модели (действие 'create'). Для каждого из них доступен эквивалентный сокращенный вариант; url_helper.index_url и url_helper.create_url.

Например:

    from .wagtail_hooks import AuthorModelAdmin

    url_helper = AuthorModelAdmin().url_helper

    index_url = url_helper.get_action_url('index')
    # OR we can use the 'index_url' shortcut
    also_index_url = url_helper.index_url # note: do not call this property as a function
    # both will output /admin/my-app/author

    create_url = url_helper.get_action_url('create')
    # OR we can use the 'create_url' shortcut
    also_create_url = url_helper.create_url # note: do not call this property as a function
    # both will output /admin/my-app/author/create

Примечание

Если вы зарегистрировали тип страницы с помощью modeladmin (например, BlogPage), и страницы этого типа могут быть добавлены в более чем одно место в дереве страниц, при посещении пользователем URL create, он будет автоматически перенаправлен на другое представление, чтобы выбрать родительскую страницу для новой страницы. Поэтому вам не нужно проверять или учитывать это в собственном коде.

Чтобы настроить поведение url_helper, см. ModelAdmin.url_helper_class.

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/stable/reference/contrib/modeladmin/tips_and_tricks/reversing_urls.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API