2012-08-14 44 views
0

用户窗体

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 

疑问

当我是使用正常的用户认证,一切工作perfec但是当我使用它与电子邮件身份验证,它给了我上述错误, 我怎么能通过这个错误,请帮助,以及我如何使电子邮件字段唯一,如何在此字段中添加索引,请帮助django的电子邮件认证

+0

这意味着模型“auth_user”的字段“first_name”不能存储NULL值。因此,您需要确保您为该字段传递了正确的值和数据类型,或者将模型自定义为接受空值,如first_name = models.CharField(max_lenght = 20,null = True) – Amyth 2012-08-14 12:16:27

+0

Try username = request.POST ['用户名'] – Vor 2012-08-14 12:36:04

+0

请尝试解释你在问什么。标题意味着与电子邮件验证的连接,我无处可见。 clean_ $ field方法的原因是什么? Django字段默认是必需的。 这两个LoginForms的原因是什么? – 2012-08-14 12:48:26

回答

2

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

就像 一般场干净()方法,上面这个方法应该返回 清理的数据,不管它是否改变任何东西,或不。

clean_first_name没有回报是一样返回None为什么Django是试图插入此字段的NULL的原因。

+0

但现在我得到 AttributeError at/accounts/register/ '用户'对象没有'后端'属性 – Abhimanyu 2012-08-14 14:29:08

+0

听起来像是你的'authenticate'或'login'调用的问题,但评论不是一个好地方堆栈跟踪。这应该是一个不同的问题。 – 2012-08-14 14:36:08