個人網站搭建 (第十五天) 用戶註冊與登陸

    這幾天正好學了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,文章的更新編輯以此連接爲準。歡迎關注源站文章!

相關文章
相關標籤/搜索