Python 在django'中,将名字、姓氏作为必需属性,而不是可选属性;s身份验证用户模型

Python 在django'中,将名字、姓氏作为必需属性,而不是可选属性;s身份验证用户模型,python,django,forms,authentication,Python,Django,Forms,Authentication,我试图确保first name和last name字段对于auth用户模型不是可选的,但我不确定如何更改它。我不能使用子类,因为我必须使用身份验证系统 我能想到的两个解决方案是: 1) 将名称放入用户配置文件中,但有一个字段不能正确使用有点愚蠢。 2) 在表单中而不是在模型中进行验证。我不认为这真的符合django的哲学 由于某种原因,我似乎找不到一种在线方式来做这件事,所以非常感谢您的帮助。我本以为这是一个很受欢迎的问题 干杯, DurandDjango扩展基本用户模型的方法是通过用户配置文件

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

我能想到的两个解决方案是: 1) 将名称放入用户配置文件中,但有一个字段不能正确使用有点愚蠢。 2) 在表单中而不是在模型中进行验证。我不认为这真的符合django的哲学

由于某种原因,我似乎找不到一种在线方式来做这件事,所以非常感谢您的帮助。我本以为这是一个很受欢迎的问题

干杯,
Durand

Django扩展基本用户模型的方法是通过用户配置文件:参见“”

如果它不适合您的需要,django.contrib.auth只是一个django应用程序,我只需要将其分叉。只要你遵守原来的界面,我想你会摆脱麻烦的


另一个选择是-它内置了OpenId支持,您可以将其与自己的OpenId提供程序一起使用。在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
模型。

最简单的解决方案
  • 只需创建一个自定义的UserRegisterForm,它继承django的默认
    UserCreationForm
  • first\u name
    last\u name
    已经是django默认的
    用户的属性。如果要将它们设置为必填字段,请将这些字段重新创建为
    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']

你也可以在Django安装中修改模型,但这显然不是一个好的选择。是的,没错,但我想它不是很好移植。目前的这个项目并不是真的应该如此,但它为其他项目设置了一个糟糕的优先级。不幸的是,我不认为真的会有一个完全干净的解决方案。Django确实需要一种方法来覆盖
用户
模型,但仍然允许使用
contrib.auth
和friends。我会在表单中进行验证。这是一个非常非侵入性的解决方案,让我们用很少的编码重用所有auth user框架,您认为这有什么违背django的理念?因为这样验证只能从表单内部进行,而不能从其他输入方法进行。不过,我想我会接受你的建议,选择表格。谢谢:)Pinax看起来很酷,我不得不在其他项目中使用它,但现在这个项目应该非常简单。谢谢这似乎是最好的选择。谢谢