Обращение адресов ModelAdmin
Иногда полезно иметь возможность получить index (список) или create адреса для модели вместе с edit, delete или inspect адресом для конкретного объекта в модели, которую вы зарегистрировали с помощью приложения modeladmin.
Сам Wagtail делает это, создавая каждый экземпляр класса ModelAdmin, который вы зарегистрировали, и используя атрибут url_helper каждого экземпляра, чтобы определить эти адреса.
Вы можете использовать похожий подход в собственном коде, создавая экземпляр ModelAdmin самостоятельно и используя его атрибут url_helper, чтобы определить адреса.
Ниже приведены некоторые примеры:
- Получение
editилиdeleteилиinspectадреса для объекта - Получение
indexилиcreateадреса для модели
Получение 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.core 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, is_parent=False, 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() для генерации адресов конкретных объектов, необходимо предоставить значение первичного ключа целевого объекта, чтобы оно могло быть включено в результирующий адрес (например, "/admin/my-app/author/edit/2/"). Следующие имена действий для конкретных объектов поддерживаются get_action_url():
Примечание
Если вы используете строковые значения в качестве первичных ключей для вашей модели, вам может потребоваться обработать случаи, когда ключ содержит символы, которые не являются безопасными для URL. Безопасны только буквенно-цифровые символы ([0-9a-zA-Z]) или следующие специальные символы: $, -, _, ., +, !, *, ', (, ).
django.contrib.admin.utils.quote() может быть использован для безопасного кодирования этих значений первичных ключей перед передачей их в get_action_url(). Если этого не сделать, Wagtail может не распознать первичный ключ при посещении адреса, что приведет к ошибкам 404.
Получение index или create адреса для модели
Доступны адреса для представления списка моделей (действие '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), и страницы этого типа могут быть добавлены более чем в одном месте в дереве страниц, при посещении пользователем адреса 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/v2.16.3/reference/contrib/modeladmin/tips_and_tricks/reversing_urls.html