Ссылки на страницу администратора 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.