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 管理员不同。
我有一个 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 管理员不同。