這幾天正好學了Flask的用戶註冊登陸功能設計,發現與Django的使用特別相似,因此學習Flask的同時也增強了我對Django表單的印象。正好網站搭建也差很少更新到用戶操做部分了,就索性把Django表單相關知識再推動一下。其實要加入用戶操做功能,也能夠直接在模板頁面中加上form標籤,而後在視圖中利用requets.POST.get來接收鍵值,最後保存在數據庫中,因此不是非要使用Django的表單功能才能設計。使用表單是由於表單的確能簡化用戶在提交用戶信息的相關處理,如輸入內容不能爲空,郵箱必須帶有@字符等,這些驗證表單的合法性最後均可以交給Django的表單來執行javascript
由於在Django中,有比較全的用戶模塊,因此我沒有另外去建立models.py來定義用戶的模型,這已經在Django中實現了。我只建立了forms.py用來加入表單字段,另外引用了Django自帶的User類。用戶的註冊登陸功能能夠比較好的涵蓋form表單的相關知識點,經常使用的form字段定義在官方文檔都有說明:表格字段html
用戶註冊java
1.我在註冊表單中,須要用戶名,郵箱,密碼等輸入python
from django import forms # django表單功能 from django.contrib.auth.models import User class RegForm(forms.Form): """ 用戶註冊表單 """ # 用戶名 username = forms.CharField(label='用戶名', max_length=30, min_length=3, widget=forms.TextInput( attrs={'class': 'form-control', 'placeholder': '請輸入用戶名'})) # 郵箱 email = forms.EmailField(label='郵箱', widget=forms.EmailInput( attrs={'class': 'form-control', 'placeholder': '請輸入郵箱'})) # 密碼 password = forms.CharField(label='密碼', min_length=6, widget=forms.PasswordInput( attrs={'class': 'form-control', 'placeholder': '請輸入密碼'})) # 再次輸入密碼 password_again = forms.CharField(label='再輸入一次密碼', min_length=6, widget=forms.PasswordInput( attrs={'class': 'form-control', 'placeholder': '再輸入依次密碼'}))
其中包含了一些屬性設置,用來規範表單的顯示數據庫
2.定義好表單以後,除了表單自動驗證的部分外,還須要另外手動添加對字段的驗證,如用戶名,郵箱是否會與數據庫已有的用戶重複,還有第二次輸入的密碼與第一次輸入的密碼是否一致,以確保用戶輸入了正確的密碼,因此還需在RegForm類中加入一些方法django
def clean_username(self): """ 清洗輸入的用戶名 :return: 清洗後的用戶名 """ username = self.cleaned_data['username'] if User.objects.filter(username=username).exists(): raise forms.ValidationError('用戶名已存在') return username def clean_email(self): """ 清洗輸入的郵箱 :return: 清洗後的郵箱 """ email = self.cleaned_data['email'] if User.objects.filter(email=email).exists(): raise forms.ValidationError('郵箱已存在') return email def clean_password_again(self): """ 清洗第二次輸入的密碼 :return: 輸入一致的密碼 """ password = self.cleaned_data['password'] password_again = self.cleaned_data['password_again'] if password != password_again: raise forms.ValidationError('兩次輸入的密碼不一致') return password
其中forms.ValidationError是拋出表單錯誤的信息ide
3.在views.py中添加用戶註冊的處理,經常使用的Forms API:Working with forms學習
from django.shortcuts import redirect, render from django.contrib import auth # auth模塊是Django提供的標準權限管理系統,能夠提供用戶身份認證, 用戶組和權限管理。 from django.urls import reverse # 反向解析 from django.contrib.auth.models import User from .forms import LoginForm, RegForm def register(request): """ 用戶註冊功能相關處理 :param request: 請求對象 :return: 註冊成功返回首頁,失敗返回註冊表單 """ if request.method == 'POST': reg_form = RegForm(request.POST) # 判斷是否有效 # 驗證經過 if reg_form.is_valid(): # 第一種註冊方法 username = reg_form.cleaned_data['username'] email = reg_form.cleaned_data['email'] password = reg_form.cleaned_data['password'] # 建立用戶 user = User.objects.create_user(username, email, password) user.save() # 登陸用戶 user = auth.authenticate(username=username, password=password) auth.login(request, user) return redirect(request.GET.get('from', reverse('blog:home'))) ''' # 第二種註冊方法 user = User() user.username = username user.email = email user.set_password(password) user.save() ''' # 驗證失敗 else: # login_form對象會自動建立表單 reg_form = RegForm() context = {'reg_form': reg_form} return render(request, 'user/register.html', context)
4.註冊頁面以下網站
<div class="col-xs-11 col-sm-5 col-lg-4 col-sm-offset-4 blog-border side-info"> <h4>歡迎註冊</h4> <form action="" method="POST">{% csrf_token %} {% for field in reg_form %} {# label去冒號 #} <label for="{{ field.id_for_label }}">{{ field.label }}</label> {{ field }} <p class="text-danger">{{ field.errors.as_text }}</p> {% endfor %} {# 錯誤信息標紅 #} <span class="pull-left text-danger">{{ login_form.non_field_errors }}</span> {# <span>用戶名:</span> #} {# <input type="text" name="username"> #} {# <span>密碼:</span> #} {# <input type="password" name="password"> #} <span style="font-weight: bold;">已有賬號?<a style="color: #337ab7;" href="{% url 'user:login' %}">點擊登陸</a></span> <input class="btn btn-primary pull-right" style="margin-bottom: 0.5em" type="submit" value="註冊"> </form> {% if user.is_authenticated %} <script type="text/javascript"> window.location.href = '/'; </script> {% else %} {% endif %} </div>
5.最後在urls.py添加url
url(r'^register/', views.register, name='register'),
用戶登陸
1.與RegForm相似,須要用戶名和密碼,少了一些驗證,只要判斷在用戶表中是否含有這個用戶名
from django import forms # django表單功能 from django.contrib import auth from django.contrib.auth.models import User class LoginForm(forms.Form): """ 用戶登陸表單 """ # 用戶名 username = forms.CharField(label='用戶名', widget=forms.TextInput( attrs={'class': 'form-control', 'placeholder': '請輸入用戶名'})) # 密碼 password = forms.CharField(label='密碼', widget=forms.PasswordInput( attrs={'class': 'form-control', 'placeholder': '請輸入密碼'})) def clean(self): """ 清洗輸入不合格的表單 :return: 清洗後的數據 """ username = self.cleaned_data['username'] password = self.cleaned_data['password'] user = auth.authenticate(username=username, password=password) # 判斷用戶是否存在 if user is None: raise forms.ValidationError('用戶名或密碼不正確') else: self.cleaned_data['user'] = user return self.cleaned_data
2.用戶登陸的視圖處理
from django.shortcuts import redirect, render from django.contrib import auth # auth模塊是Django提供的標準權限管理系統,能夠提供用戶身份認證, 用戶組和權限管理。 from django.urls import reverse # 反向解析 from .forms import LoginForm def login(request): """ 用戶登陸邏輯處理 :param request: :return: 登陸視圖 """ if request.method == 'POST': login_form = LoginForm(request.POST) # 判斷是否有效 # 驗證經過 if login_form.is_valid(): # cleaned_data是一個字典,包含了字段的信息 # 表示清理過或者整理過的數據,比較乾淨的數據 # username = login_form.cleaned_data['username'] # password = login_form.cleaned_data['password'] # user = auth.authenticate(username=username, password=password) # 判斷用戶是否存在 # if user is not None: user = login_form.cleaned_data['user'] auth.login(request, user) # 若是沒有獲取到源頁面就返回到首頁 referer = request.GET.get('from', reverse('blog:blog')) return redirect(referer) # 驗證失敗 else: # login_form對象會自動建立表單 login_form = LoginForm() context = {'login_form': login_form} return render(request, 'user/login.html', context)
3.建立視圖模板
<div class="col-xs-11 col-sm-5 col-lg-4 col-sm-offset-4 blog-border side-info"> <h4>用戶登陸</h4> <form action="" method="POST"> {% csrf_token %} {% for field in login_form %} <label for="{{ field.id_for_label }}">{{ field.label }}</label> {{ field }} <p class="text-danger">{{ field.errors.as_text }}</p> {% endfor %} {# 錯誤信息標紅 #} <span class="pull-left text-danger">{{ login_form.non_field_errors }}</span> {# <span>用戶名:</span> #} {# <input type="text" name="username"> #} {# <span>密碼:</span> #} {# <input type="password" name="password"> #} <span style="font-weight: bold;">沒有賬號?<a style="color: #337ab7;" href="{% url 'user:register' %}">點擊註冊</a></span> <input class="btn btn-primary pull-right" style="margin-bottom: 0.5em" type="submit" value="登陸"> </form> {% if user.is_authenticated %} <script type="text/javascript"> window.location.href = '/'; </script> {% else %} {% endif %} </div>
4.在url.py添加
url(r'^login/', views.login, name='login'),
5.還可使用以下方法顯示用戶信息
<p>加入時間:{{ user.date_joined }}</p> <p>上次登陸時間:{{ user.last_login}}</p>
原文出處:https://www.jzfblog.com/detail/105,文章的更新編輯以此連接爲準。歡迎關注源站文章!