我正在尝试确保auth User模型的名字和姓氏字段不是可选的,但我不确定如何更改它。 我不能使用子类,因为我必须使用身份验证系统。
我能想到的两个解决方案是:1)将名称放在用户配置文件中,但是有一个我无法正确使用的字段有点傻。 2)以表格而不是模型进行验证。 我认为这不符合django的理念......
出于某种原因,我似乎无法在网上找到这样的方式,所以任何帮助都表示赞赏。 我原以为这会是一个很受欢迎的问题。
干杯,杜兰德
我正在尝试确保auth User模型的名字和姓氏字段不是可选的,但我不确定如何更改它。 我不能使用子类,因为我必须使用身份验证系统。
我能想到的两个解决方案是:1)将名称放在用户配置文件中,但是有一个我无法正确使用的字段有点傻。 2)以表格而不是模型进行验证。 我认为这不符合django的理念......
出于某种原因,我似乎无法在网上找到这样的方式,所以任何帮助都表示赞赏。 我原以为这会是一个很受欢迎的问题。
干杯,杜兰德
我肯定会在表格上进行验证。 如果您愿意,您甚至可以在管理员中进行更多表单验证。
感谢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方式是通过用户配置文件:请参阅“ 存储有关用户的其他信息 ”。
如果它不符合您的需求,django.contrib.auth只是一个Django应用程序,我会简单地分叉它。 只要您遵守原始界面,我认为您将摆脱困境。
另一个选项是Pinax - 它内置了OpenId支持,您可以将它与您自己的openid提供程序一起使用。 OpenId本机支持是我在Django中真正想念的电池 。