Django用户登录和注销(三)

基于类视图和forms。

1、在users.py的app新创一个python文件,命名为forms.py

from django import forms


class UserForm(forms.Form):
    username = forms.CharField(required=True)
    password = forms.CharField(min_length=5, required=True, widget=forms.PasswordInput)

2、基于类视图写views.py

若请求是get,直接实例化UserForm,若请求是post,则把提交的数据实例化UserForm。

如果login_form.is_valid()为真,则数据存储在login_form.cleaned_data里。

from django.shortcuts import render, redirect
from django.urls import reverse
from django.contrib.auth import authenticate, login, logout
from django.views import View

from .forms import UserForm


# 基于forms
class LoginView(View):
    def get(self, request, *args, **kwargs):
        login_form = UserForm()
        return render(request, "login.html", {"form": login_form})

    def post(self, request, *args, **kwargs):
        login_form = UserForm(request.POST)
        if login_form.is_valid():
            username = login_form.cleaned_data["username"]
            password = login_form.cleaned_data["password"]
            user = authenticate(request, username=username, password=password)
            if user is not None:
                login(request, user)
                return redirect(reverse("index"))
            else:
                return render(request, "login.html", {"form": login_form, "message": "请输入正确的用户名或密码"})
        else:
            return render(request, "login.html", {"form": login_form, "errors": login_form.errors})


class LogoutView(View):
    def get(self, request, *args, **kwargs):
        logout(request)
        return redirect(reverse("index"))

3、修改login.html显示错误信息,默认html语法写表单。

基于前面的login.html。这里只显示修改的部分。

        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-default">登录</button>
                {% csrf_token %}
            </div>
        </div>
        {% if errors %}
        <div class="form-group">
            {% for key, error in errors.items %}
            <label for="error" class="col-sm-2 control-label">{{ key }}:{{ error }}</label>
            {% endfor %}
        </div>
        {% endif %}
        {% if message %}
        <div class="form-group">
            <label for="error" class="col-sm-2 control-label">{{ message }}</label>
        </div>
        {% endif %}

4、(推荐)不采用html格式写表单。直接采用forms。

把原来的表单注释掉

 <!--
<div class="form-group">
            <label for="username" class="col-sm-2 control-label">用户名</label>
            <div class="col-sm-2">
                <input type="text" class="form-control" name="username" id="firstname" placeholder="请输入用户名">
            </div>
        </div>
        <div class="form-group">
            <label for="password" class="col-sm-2 control-label">密码</label>
            <div class="col-sm-2">
              <input type="password" class="form-control" name="password" id="lastname" placeholder="请输入密码">
            </div>
        </div>
-->

这里只为了实现功能,美化不作要求。

然后改成

{{ form.as_p }}

详细请参考官方文档:https://docs.djangoproject.com/en/2.1/ref/forms/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值