Ссылки на страницу администратора Django/wagtail указывают на недопустимый адрес

У меня сайт wagtail и у меня проблема с разделом "пользователи" на странице администратора

Мой users/admin.py имеет вид :

from django.contrib import admin
from django.contrib.auth import admin as auth_admin
from django.contrib.auth import get_user_model

from psymatik.users.forms import (
    UserChangeForm,
    UserCreationForm,
)

User = get_user_model()

admin.site.register(User)

class UserAdmin(auth_admin.UserAdmin):
    form = UserChangeForm
    add_form = UserCreationForm
    fieldsets = (
        ("User", {"fields": ("username",)}),
    ) + auth_admin.UserAdmin.fieldsets
    list_display = ["username", "is_superuser"]
    search_fields = ["username"]

А мой users/wagtail_hooks.py:

from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register 

from .models import User


class UserAdmin(ModelAdmin):
    model = User 
    menu_label = "Users"  
    menu_icon = "pick" 
    menu_order = 200 
    add_to_settings_menu = False 
    exclude_from_explorer = False 
    list_display = ( "name")
    list_filter = ("name")
    search_fields = ("name")
modeladmin_register(UserAdmin)

У меня проблема в том, что когда я нахожусь в admin/users и нажимаю на ссылку Users в боковой панели, я попадаю в admin/users/user и получаю ошибку

"ValueError at /admin/users/user/ Поле 'id' ожидало число, но получило 'user'."

Почему ссылка боковой панели указывает на admin/users/user, а не просто admin/users (что работает)? Как лучше всего это настроить?

Когда вы регистрируете модель с помощью ModelAdmin, URL будут формироваться из имени приложения ("users" здесь) и имени модели ("user"), поэтому ожидается /admin/users/user. Однако в этом случае Wagtail уже предоставляет область управления пользователями (доступную из подменю Settings), которая существует в пространстве имен URL /admin/users/ - эти URL в итоге сталкиваются с теми, которые вы добавляете через ModelAdmin.

Похоже, что ваше определение UserAdmin более или менее дублирует функциональность, уже предоставляемую Wagtail, так что, возможно, вам это вообще не нужно. Если да, то одна вещь, которая может сработать, это редактирование параметра INSTALLED_APPS в настройках вашего проекта, чтобы переместить ваше приложение users выше wagtail.contrib.users - таким образом, шаблоны URL для вашего собственного приложения будут иметь приоритет над встроенной областью /admin/users/ Wagtail, и он будет правильно интерпретировать все, что находится под /admin/users/user/ как принадлежащее вашему собственному приложению (в то время как все остальные URL под /admin/users/ будут возвращаться к встроенной области Wagtail).

Если это не сработает, вам нужно будет либо переименовать ваше приложение users (проще сказать, чем сделать для уже существующего проекта...), либо настроить ModelAdmin на использование альтернативного пути URL. Не похоже, что ModelAdmin в настоящее время предоставляет официальный механизм для этого, но переопределение объекта AdminURLHelper должно работать - в users/wagtail_hooks.py:

from wagtail.contrib.modeladmin.helpers import AdminURLHelper

class UsersAdminURLHelper(AdminURLHelper):
    def _get_action_url_pattern(self, action):
        # hard-code 'user-accounts' as the URL path instead of /users/user/
        if action == "index":
            return r"^user-accounts/$"
        return r"^user-accounts/%s/$" % action

class UserAdmin(ModelAdmin):
    model = User
    url_helper_class = UsersAdminURLHelper
    # all other settings as before

Случайно, users/admin.py не связан здесь - он управляет бэкендом администратора Django admin, который отличается от администратора Wagtail.

Вернуться на верх