2017-08-11 47 views
0

登记表的Django我下面已经创建了下面的报名表教程:继承形式UserCreationForm

from django.contrib.auth.forms import UserCreationForm 

class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(required = True) 

    class Meta: 
     model = User 
     fields = (
      'username', 
      'first_name', 
      'last_name', 
      'email', 
      'password1', 
      'password2' 
     ) 

     def save(self, commit = True): 
      user = super(RegistrationForm, self).save(commit= False) 
      user.first_name = self.cleaned_data['first_name'] 
      user.last_name = self.cleaned_data['last_name'] 
      user.email = self.cleaned_data['email'] 

      if commit: 
       user.save() 

       return User 

为什么email = forms.EmailField(required = True)class Meta外提到的唯一领域,这个又是什么目的?在contrib.auth.AbstractUser

回答

0

email字段(这是由子类User)具有:

email = models.EmailField(_('email address'), blank=True) 

,这意味着它允许是blank

因为我们希望它在表单中需要(为了本教程的目的),我们必须明确声明它。

0

如果你想在Django创建用户注册系统,你可以在其中创建forms.py文件贴:

from django import forms 
from django.contrib.auth.models import User 
from django.core.exceptions import ValidationError 


class RegisterUserForm(forms.ModelForm): 
    password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'input'})) 
    password2 = forms.CharField(label="Repeat password", widget=forms.PasswordInput(attrs={'class': 'input'})) 

    class Meta: 
     model = User 
     fields = ['username', 'email'] 
     widgets = { 
      'username': forms.TextInput(attrs={'class': 'input'}), 
      'email': forms.EmailInput(attrs={'class': 'input'}) 
     } 

    # Validating password 
    def clean_password2(self): 
     cd = self.cleaned_data 
     if cd['password2'] != cd['password']: 
      raise ValidationError("Password don't match") 

     return cd['password2'] 

而且在views.py

-*- coding: utf-8 -*- 
from __future__ import unicode_literals 

from django.http import HttpResponseForbidden, HttpResponse 
from django.shortcuts import render 

# Create your views here. 
from django.views.generic import CreateView 

from account.forms import RegisterUserForm 


class RegisterUserView(CreateView): 
    form_class = RegisterUserForm 
    template_name = "account/register.html" 

    def dispatch(self, request, *args, **kwargs): 
     if request.user.is_authenticated(): 
      return HttpResponseForbidden() 

     return super(RegisterUserView, self).dispatch(request, *args, **kwargs) 

    def form_valid(self, form): 
     user = form.save(commit=False) 
     user.set_password(form.cleaned_data['password']) 
     user.save() 
     return HttpResponse('User registered') 

我们覆盖dispath()方法来确保用户可以访问表单,当且仅当他没有通过身份验证。 而对于form_valid方法,我们使用set_password()方法加密密码,然后我们提交到数据库。 你可能会重定向用户,如果成功,而不是像我一样返回HttpResponse()