在Django管理界面中允许用户名包含“-”字符

8 投票
1 回答
4259 浏览
提问于 2025-04-15 13:18

在我们的网页应用中,我们需要允许用户名中包含连字符“-”。我已经通过这个正则表达式 r'^[\w-]+$' 成功地在用户注册时实现了这一点。

现在我想在管理员应用中也能编辑用户名,让它们可以包含“-”这个字符。但是目前我无法编辑任何包含连字符的用户名,因为系统会返回一个验证错误。

我希望尽量避免直接修改django的代码。我对编程还比较陌生,不知道这是不是我应该用“子类化”来解决的问题?

1 个回答

19

这其实很简单,只需要重写用户模型的管理类就可以了。在你的某个应用里,打开 admin.py 文件,加入以下代码。

from django.contrib import admin
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

class MyUserCreationForm(UserCreationForm):
    username = forms.RegexField(
        label='Username', 
        max_length=30, 
        regex=r'^[\w-]+$',
        help_text = 'Required. 30 characters or fewer. Alphanumeric characters only (letters, digits, hyphens and underscores).',
        error_message = 'This value must contain only letters, numbers, hyphens and underscores.')

class MyUserChangeForm(UserChangeForm):
    username = forms.RegexField(
        label='Username', 
        max_length=30, 
        regex=r'^[\w-]+$',
        help_text = 'Required. 30 characters or fewer. Alphanumeric characters only (letters, digits, hyphens and underscores).',
        error_message = 'This value must contain only letters, numbers, hyphens and underscores.')

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm
    add_form = MyUserCreationForm

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

接下来我来简单解释一下。

第一个类的定义(MyUserCreationForm)是 UserCreationForm 的一个子类(没错,你的理解是对的)。这个表单是在你点击 Django 管理网站的“添加用户”时出现的。我们在这里做的就是重新定义 username 字段,让它支持我们改进过的、可以接受连字符的正则表达式,并且更新 helptext 以反映这一点。

第二个类的定义也是做同样的事情,只不过是针对 UserChangeForm。

最后一个类的定义是 UserAdmin 的一个子类,UserAdmin 是用户模型默认使用的管理类。在这里,我们声明希望在管理类中使用我们新的自定义表单。

需要注意的是,对于这些子类,我们只修改必要的部分。其余的内容会从父类(UserCreationForm、UserChangeForm 和 UserAdmin)继承过来。

最后,我们要做一个重要的步骤,就是将用户模型注册到管理网站上。为此,我们先取消注册默认的 UserAdmin,然后用我们改进的 MyUserAdmin 类进行注册。

你会发现,使用这些方法自定义 Django 管理网站非常简单,特别是因为管理网站本身就是一个普通的 Django 应用。

撰写回答