2017-08-11 50 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()