【问题标题】:django email authenticationdjango电子邮件身份验证
【发布时间】:2012-08-10 17:27:13
【问题描述】:

用户表单

class UserForm(forms.ModelForm):
    confirm_password = forms.CharField(label="Confirm Password",widget=forms.PasswordInput(attrs = {'placeholder': 'Confirm Password','class':'required'}))    
    phone =    forms.CharField(max_length = 15,widget = forms.TextInput(attrs = {'placeholder':'Enter mobile no. ','class':'required number'}))
    profession = forms.CharField(max_length= 50,widget = forms.Select(choices = PROFESSION_CHOICES,attrs = {'class':'required'}))

    email = forms.EmailField(label='Email address',max_length = 75,widget = forms.TextInput(attrs={'placeholder':'Enter a valid email.','class':'required email'}))
    sex = forms.CharField(max_length = 20,label="I am :",widget=forms.Select(choices=SEX_CHOICES,attrs = {'class':'required'}))
    password = forms.CharField(label="Password",widget=forms.PasswordInput(attrs = {'placeholder': 'Password','class':'required'})) 
    first_name = forms.CharField(max_length = 50,widget = forms.TextInput(attrs={'placeholder':'Please enter your real name.','class':'required alphabets'}))
    last_name = forms.CharField(max_length = 50,widget = forms.TextInput(attrs={'placeholder':'Enter last name.','class':'required alphabets'}))
    def clean_first_name(self):
        first_name = self.cleaned_data['first_name']
        if first_name == '':
            raise forms.ValidationError("This field is required.")
    def clean_phone(self):
        phone = self.cleaned_data['phone']
        if phone == '':
            raise forms.ValidationError("This field is required.")

    def clean_last_name(self):
        last_name = self.cleaned_data['last_name']
        if last_name == '':
            raise forms.ValidationError("This field is required.")
    def clean_email(self):
        email = self.cleaned_data.get("email")
        try:
            user  = User.objects.get(email = email)
            raise forms.ValidationError("Email already in use.")
        except User.DoesNotExist:
            return email
    def clean_profession(self):
        profession = self.cleaned_data['profession']
        if profession == "":
            raise forms.ValidationError("Select a valid option.")

    def clean_sex(self):
        sex = self.cleaned_data['sex']
        if sex == "":
            raise forms.ValidationError("Select a valid option.")

    def save(self,*args,**kw):
        user = super(UserForm,self).save(*args,**kw)
        user.set_password(self.cleaned_data.get("password"))
        user.first_name = self.cleaned_data.get("first_name")
        user.last_name = self.cleaned_data.get("last_name")
        user.email = self.cleaned_data.get("email")
        user.save()
        user.get_profile().phone = self.cleaned_data.get('phone')
        user.get_profile().location = self.cleaned_data.get('location')
        user.get_profile().profession = self.cleaned_data.get('profession')
        user.get_profile().sex = self.cleaned_data.get('sex')
        return user

    class Meta:
        model = User
        fields = ('username','email','password','confirm_password','first_name','last_name','sex','phone','profession')
        widgets = {
            'password': forms.PasswordInput(),
        }

用户注册视图

def register_user(request):
    if request.POST:
        data = request.POST.copy()

        data["username"] = 'user'
        rform = UserForm(data)
        #form = UserProfileForm()
        if rform.is_valid():
            try:
                user = rform.save()
                user.username = "user"+str(user.id)
                user.save()
                user = authenticate(username = user.username,password=user.password)
                #register user
                login(request,user)
                return redirect(index)
            except:
                print "Unexpected error"
                raise
        else:
        # submit the same form again.
            form = LoginForm();
            sform = LoginForm()
            return render_to_response('register.html',{'rform':rform,'form':form,'sform':sform},context_instance = RequestContext(request))
    else:
        rform  = UserForm()
        #form = UserProfileForm()
        form = LoginForm()
        sform = LoginForm()
        return render_to_response('register.html',{'rform':rform,'form':form,'sform':sform},context_instance = RequestContext(request))

错误

IntegrityError at /accounts/register/
auth_user.first_name may not be NULL

怀疑

当我使用普通用户身份验证时,一切正常,但是当我将它与电子邮件身份验证一起使用时,它给了我上述错误, 我如何克服这个错误,请帮助,以及如何使电子邮件字段独一无二,就像我如何向该字段添加索引一样,请帮助

【问题讨论】:

  • 这意味着模型“auth_user”的字段“first_name”不能存储NULL值。因此,您需要确保为该字段传递了正确的值和数据类型,或者自定义模型以接受 Null 值,例如 first_name = models.CharField(max_lenght=20, null=True)
  • 试试 username = request.POST['username']
  • 请尝试解释您的要求。标题暗示与电子邮件身份验证的连接,我看不到任何地方。 clean_$field 方法的原因是什么?默认情况下,Django 字段是必需的。这两个LoginForms的原因是什么?

标签: python django django-forms django-authentication


【解决方案1】:

您的自定义字段清理方法 (clean_*) 不会返回清理后的值。来自表单验证文档:https://docs.djangoproject.com/en/1.4/ref/forms/validation/

就像 通用字段 clean() 方法,上面,这个方法应该返回 清理过的数据,不管它是否改变了任何东西。

clean_first_name 没有与返回 None 相同的返回值,以及 Django 尝试为此字段插入 NULL 的原因。

【讨论】:

  • 但现在我在 /accounts/register/ 'User' 对象没有属性 'backend' 处收到 AttributeError
  • 听起来你的 authenticatelogin 调用有问题,但 cmets 不是堆栈跟踪的好地方。这应该是一个不同的问题。
猜你喜欢
  • 1970-01-01
  • 2011-12-08
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多