Django/wagtail 指向无效地址的管理页面链接

Django/wagtail admin page links pointing to invalid address

我有一个 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 并单击边栏中的用户 link 时,我被带到 admin/users/user 并收到错误消息

“/admin/users/user/ 处的值错误 字段 'id' 需要一个数字,但得到的是“用户”。”

为什么侧边栏 link 指向 admin/users/user 而不是 admin/users(这确实有效)?设置它的最佳方法是什么?

当您使用 ModelAdmin 注册模型时,URLs 将由应用程序名称(此处为 'users')和模型名称('user')组成,因此 /admin/users/user 是预期的。但是,在这种情况下,Wagtail 已经提供了一个位于 /admin/users/ URL 命名空间下的用户管理区域(可从“设置”子菜单获得)——这些 URL 最终会与您添加的那些发生冲突通过 ModelAdmin。

看起来您的 UserAdmin 定义或多或少地重复了 Wagtail 已经提供的功能,因此您可能根本不需要它。如果这样做, 可能 起作用的一件事是编辑项目设置中的 INSTALLED_APPS 设置,将 users 应用移到 wagtail.contrib.users 之上 - 这样,您自己的应用程序的 URL 模式将优先于 Wagtail 内置的 /admin/users/ 区域,并且它将正确地将 /admin/users/user/ 下的任何内容解释为属于您自己的应用程序(同时让所有其他 URLs under /admin/users/ fall back to Wagtail built-in area).

如果这不起作用,您需要重命名您的 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 backend,这与 Wagtail 管理员不同。