[英]Making first name, last name a required attribute rather than an optional one in Django's auth User model
我试图确保 auth User 模型的名字和姓氏字段不是可选的,但我不确定如何更改它。 我不能使用子类,因为我必须使用身份验证系统。
我能想到的两个解决方案是:
出于某种原因,我似乎无法找到在线执行此操作的方法,因此感谢您提供任何帮助。 我会认为这将是一个受欢迎的问题。
干杯,杜兰德
UserCreationForm
。first_name
和last_name
已经是 django 默认User
属性。 如果要将它们设为必填字段, forms.CharField(...)
这些字段重新创建为forms.CharField(...)
。现在使用您自己的用户注册表。
# Contents usersapp/forms.py
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
# Inherit Django's default UserCreationForm
class UserRegisterForm(UserCreationForm):
first_name = forms.CharField(max_length=50) # Required
last_name = forms.CharField(max_length=50) # Required
# All fields you re-define here will become required fields in the form
class Meta:
model = User
fields = ['username', 'email', 'first_name', 'last_name', 'password1', 'password2']
感谢 Mbuso 的建议。 这是我为感兴趣的人提供的完整实现。 在看源码之前,让我们看看它是什么样子的:
我已经实现了一个配置文件模型,但是没有它也可以正常工作。
from django.core.exceptions import ValidationError
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm
from django.contrib.auth.models import User
from apps.profiles.models import Profile
# Define an inline admin descriptor for Profile model
# which acts a bit like a singleton
class UserProfileInline(admin.StackedInline):
model = Profile
can_delete = False
verbose_name_plural = 'profile'
class MyUserChangeForm(UserChangeForm):
def clean_first_name(self):
if self.cleaned_data["first_name"].strip() == '':
raise ValidationError("First name is required.")
return self.cleaned_data["first_name"]
def clean_last_name(self):
if self.cleaned_data["last_name"].strip() == '':
raise ValidationError("Last name is required.")
return self.cleaned_data["last_name"]
# Define a new User admin
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
inlines = UserProfileInline,
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
注意:如果您确实实现了配置文件模型,建议使用UserProfile
作为名称,因为这是文档中的内容并且似乎是标准(这部分是在我开始从事该项目之前开发的)。 如果您使用的是 Django 1.5 或更高版本,请一起跳过UserProfile
并扩展User
模型。
我肯定会在表单上进行验证。 如果您愿意,您甚至可以在管理中进行更多表单验证。
Django 扩展基本 User 模型的方法是通过用户配置文件:请参阅“ 存储有关用户的附加信息”。
如果它不符合您的需求,django.contrib.auth 只是一个 Django 应用程序,我会简单地将它分叉。 只要你遵守原来的界面,我想你就会摆脱困境。
另一种选择是Pinax - 它内置了 OpenId 支持,您可以将它与您自己的 openid 提供程序一起使用。 OpenId本机支持是我在 Django 中非常怀念的电池。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.