Add add_to_admin_menu option for modeladmin (#8634)

pull/8714/head
Oliver Parker 2022-06-20 14:10:18 +01:00 zatwierdzone przez GitHub
rodzic db7a0c96e3
commit 97d0d14cd8
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
7 zmienionych plików z 75 dodań i 9 usunięć

Wyświetl plik

@ -97,6 +97,7 @@ This lets you use Wagtail-specific layouts in an otherwise traditional Django mo
menu_order = 200 # will put in 3rd place (000 being 1st, 100 2nd)
add_to_settings_menu = False # or True to add your model to the Settings sub-menu
exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view
add_to_admin_menu = True # or False to exclude your model from the menu
list_display = ('title', 'author')
list_filter = ('author',)
search_fields = ('title', 'author')

Wyświetl plik

@ -46,3 +46,9 @@ Wagtail's 'Explorer' menu item has an order value of `100`, so supply a value gr
If you'd like the menu item for your model to appear in Wagtail's 'Settings' sub-menu instead of at the top level, add `add_to_settings_menu = True` to your `ModelAdmin` class.
This will only work for individual `ModelAdmin` classes registered with their own `modeladmin_register` call. It won't work for members of a `ModelAdminGroup`.
## `ModelAdmin.add_to_admin_menu`
**Expected value**: `True` or `False`
If you'd like this model admin to be excluded from the menu, set to `False`.

Wyświetl plik

@ -43,9 +43,15 @@ class TestHome(TestCase, WagtailTestUtils):
# Check that the explorer menu item is here, with the right start page.
self.assertContains(
response,
'{"name": "explorer", "label": "Pages", "icon_name": "folder-open-inverse", "classnames": "", "url": "/admin/pages/", "attrs": null}, 1]',
'[{"name": "explorer", "label": "Pages", "icon_name": "folder-open-inverse", "classnames": "", "url": "/admin/pages/", "attrs": null}, 1]',
)
# There should be a link to the friend admin in on the home page.
self.assertContains(response, '"url": "/admin/friendadmin/"')
# Since we've marked this as not being shown, it shouldn't be shown.
self.assertNotContains(response, '"url": "/admin/enemyadmin/"')
# check that is_shown is respected on menu items
response = self.client.get(reverse("wagtailadmin_home") + "?hide-kittens=true")
self.assertNotContains(

Wyświetl plik

@ -47,6 +47,7 @@ class WagtailRegisterable:
"""
add_to_settings_menu = False
add_to_admin_menu = True
exclude_from_explorer = False
def register_with_wagtail(self):
@ -58,15 +59,18 @@ class WagtailRegisterable:
def register_admin_urls():
return self.get_admin_urls_for_registration()
menu_hook = (
"register_settings_menu_item"
if self.add_to_settings_menu
else "register_admin_menu_item"
)
if self.add_to_settings_menu:
menu_hook = "register_settings_menu_item"
elif self.add_to_admin_menu:
menu_hook = "register_admin_menu_item"
else:
menu_hook = None
@hooks.register(menu_hook)
def register_admin_menu_item():
return self.get_menu_item()
if menu_hook:
@hooks.register(menu_hook)
def register_admin_menu_item():
return self.get_menu_item()
# Overriding the explorer page queryset is a somewhat 'niche' / experimental
# operation, so only attach that hook if we specifically opt into it

Wyświetl plik

@ -0,0 +1,31 @@
# Generated by Django 4.0.4 on 2022-05-31 18:54
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("modeladmintest", "0010_translatablebook"),
]
operations = [
migrations.CreateModel(
name="Enemy",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("first_name", models.CharField(max_length=255)),
("last_name", models.CharField(max_length=255)),
("phone_number", models.CharField(max_length=255)),
("address", models.CharField(max_length=255)),
],
),
]

Wyświetl plik

@ -156,6 +156,15 @@ class Friend(models.Model):
return self.first_name
class Enemy(models.Model):
"""model used to test add_to_admin_menu usage in ModelAdminMenuItem"""
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
phone_number = models.CharField(max_length=255)
address = models.CharField(max_length=255)
class RelatedLink(models.Model):
title = models.CharField(
max_length=255,

Wyświetl plik

@ -15,6 +15,7 @@ from .models import (
Author,
Book,
Contributor,
Enemy,
Friend,
Person,
Publisher,
@ -198,6 +199,13 @@ class PageAdmin(ModelAdmin):
menu_label = "Page"
class EnemyAdmin(ModelAdmin):
model = Enemy
add_to_admin_menu = False
menu_icon = "snippet"
base_url_path = "enemyadmin"
modeladmin_register(AuthorModelAdmin)
modeladmin_register(BookModelAdmin)
modeladmin_register(TranslatableBookModelAdmin)
@ -211,3 +219,4 @@ modeladmin_register(VisitorAdmin)
modeladmin_register(ContributorAdmin)
modeladmin_register(RelatedLinkAdmin)
modeladmin_register(PageAdmin)
modeladmin_register(EnemyAdmin)