在Django Admin界面中的用户名中允许使用" - "字符

Tri*_*ton 7 python django django-admin

在我们的webapp中,我们需要在用户名中使用短划线" - ".我已经为消费者注册过程启用了这个正则表达式'^ [\ w - ] + $'

如何告诉管理员应用程序以便我可以在auth> users中编辑用户名以允许用户名中的" - "字符?目前我无法编辑其中包含破折号的任何用户名,因为它将在用户名上返回验证错误.

如果可能的话,我想尽量避免直接修补django.我对编程很新,但是我会使用"子类化"吗?

six*_*ear 18

这应该像覆盖User ModelAdmin类的行为一样简单.在您的某个应用中,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)
Run Code Online (Sandbox Code Playgroud)

这是一个小解释.

第一个类定义(MyUserCreationForm)是UserCreationForm的子类(是的,您的术语是正确的).这是您在Django管理站点中单击"添加用户"时显示的表单.我们在这里所做的只是重新定义username字段以使用我们改进的连字符接受正则表达式,并更改helptext以反映这一点.

除了UserChangeForm之外,第二个类定义也是如此.

最终的类定义是UserAdmin的子类,UserAdmin是User模型默认使用的ModelAdmin.在这里,我们声明我们要在ModelAdmin中使用新的自定义表单.

请注意,对于每个子类,我们只改变我们所拥有的内容.该类的其余部分将从其父级继承(UserCreationForm,UserChangeForm和UserAdmin).

最后,我们执行向管理站点注册用户模型的重要步骤.为此,我们取消注册默认的UserAdmin,然后注册我们改进的MyUserAdmin类.

你会发现使用这些技术很容易定制Django管理站点,特别是考虑到管理站点只是一个常规的Django应用程序.