在Django管理界面中允许用户名包含“-”字符
在我们的网页应用中,我们需要允许用户名中包含连字符“-”。我已经通过这个正则表达式 r'^[\w-]+$' 成功地在用户注册时实现了这一点。
现在我想在管理员应用中也能编辑用户名,让它们可以包含“-”这个字符。但是目前我无法编辑任何包含连字符的用户名,因为系统会返回一个验证错误。
我希望尽量避免直接修改django的代码。我对编程还比较陌生,不知道这是不是我应该用“子类化”来解决的问题?
1 个回答
这其实很简单,只需要重写用户模型的管理类就可以了。在你的某个应用里,打开 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 应用。