Обратный поиск 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