繁体   English   中英

在 Django 的 auth User 模型中使名字、姓氏成为必需属性而不是可选属性

[英]Making first name, last name a required attribute rather than an optional one in Django's auth User model

我试图确保 auth User 模型的名字和姓氏字段不是可选的,但我不确定如何更改它。 我不能使用子类,因为我必须使用身份验证系统。

我能想到的两个解决方案是:

  1. 将名称放在用户配置文件中,但有一个我无法正确使用的字段有点愚蠢。
  2. 在表单中而不是在模型中进行验证。 我不认为这真的符合 Django 的哲学......

出于某种原因,我似乎无法找到在线执行此操作的方法,因此感谢您提供任何帮助。 我会认为这将是一个受欢迎的问题。

干杯,杜兰德

最简单的解决方案

  • 只需创建一个自定义UserRegisterForm ,它继承了 django 的默认UserCreationForm
  • first_namelast_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM