假设您在 users 应用程序中工作,并且您的自定义用户模型的名称是 CustomUser,它位于 users/models.py 中。如果您不想在用户名中允许 @, ., -, +,则创建一个 forms.py,如下所示:
users/forms.py
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser
class CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = CustomUser
fields = ('username', 'first_name', 'last_name', 'email')
def clean(self):
cleaned_data = super(CustomUserCreationForm, self).clean()
username = cleaned_data.get('username')
if ('@', '.', '-', '+') in username:
self.add_error('username', 'Symbols @/./-/+ are not allowed in username.')
return cleaned_data
# same for UserChangeForm
class CustomUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = CustomUser
fields = ('username', 'first_name', 'last_name')
# Removed email field. Anyone won't want to change email after registering. Go as you like.
def clean(self):
cleaned_data = super(CustomUserChangeForm, self).clean()
username = cleaned_data.get('username')
if ('@', '.', '-', '+') in username:
self.add_error('username', 'Symbols @/./-/+ are not allowed in username.')
return cleaned_data
如果有人尝试在用户名中使用@, ., -, + 注册,则会显示您的自定义错误消息。
要更改 Django 默认描述 Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.,您的 models.py 应如下所示:
users/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.validators import UnicodeUsernameValidator
User = get_user_model
class CustomUser(AbstractUser):
username_validator = UnicodeUsernameValidator()
username = models.CharField(
"Username",
max_length = 150,
unique = True,
help_text = ("Required. 150 characters or fewer. Letters, and digits only."),
# customize the above string as you want
validators = [username_validator],
error_messages = {
'unique': ("A user with that username already exists."),
},
)
email = models.EmailField(max_length=254, blank=False, unique = True)
first_name = models.CharField(max_length = 30, blank = False)
last_name = models.CharField(max_length = 50, blank = False)
别忘了检查您的 views.py 和模板。
users/views.py
from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse_lazy
from django.views.generic import CreateView
from .forms import CustomUserCreationForm
from .models import CustomUser
...
# Create your views here.
class SignUpView(SuccessMessageMixin, CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('login')
template_name = 'signup.html'
success_message = 'Account was created successfully! Now Log In using your details.'
...
用户/模板/signup.html
...
{% block content %}
<h2>Sign Up</h2>
<div>
<form action="" method="POST">
{% csrf_token %}
{{ form.as_p }}
<button class="" type="submit">Sign Up</button>
</form>
</div>
{% endblock content %}
...
这是您必须使用的最少 HTML。然后一切都会如你所愿。
您可以添加更多自定义项(例如添加 Django 简洁表单,或在用户名/电子邮件中不区分大小写,或避免有时键入 email@gmail.com 和 email@googlemail.com 的用户重复。两者是相同的电子邮件。如果您不这样做t 包括检查,那么您的数据库中将有重复的用户。