Python 允许&引用;Django管理界面中用户名中的字符

Python 允许&引用;Django管理界面中用户名中的字符,python,django,django-admin,Python,Django,Django Admin,在我们的webapp中,我们需要在用户名中允许破折号“-”。 我已经为消费者注册过程启用了这个正则表达式 r'^[\w-]+$' 如何告诉管理员应用程序,以便在auth>users中编辑用户名以允许用户名中使用“-”字符?目前我无法编辑任何带有破折号的用户名,因为这将返回用户名验证错误 如果可能的话,我想尽量避免直接修补django。 我对编程相当陌生,但这就是我使用“子类化”的目的吗?这应该像重写User ModelAdmin类的行为一样简单。在您的一个应用程序中,在admin.py中包含以下

在我们的webapp中,我们需要在用户名中允许破折号“-”。 我已经为消费者注册过程启用了这个正则表达式 r'^[\w-]+$'

如何告诉管理员应用程序,以便在auth>users中编辑用户名以允许用户名中使用“-”字符?目前我无法编辑任何带有破折号的用户名,因为这将返回用户名验证错误

如果可能的话,我想尽量避免直接修补django。
我对编程相当陌生,但这就是我使用“子类化”的目的吗?

这应该像重写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)
这里有一点解释

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

除了UserChangeForm之外,第二个类定义也执行相同的操作

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

请注意,对于这些子类中的每一个子类,我们只更改必须更改的内容。该类的其余部分将从其父级继承(分别为UserCreationForm、UserChangeForm和UserAdmin)

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


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

谢谢sixthgear,这对我来说很有意义,谢谢你花时间写下详细的解释。