Python学习笔记:7.2.3 Django快速建站 - 表单

本文记录了使用Django创建用户管理应用,开发用户登录功能的过程,重点讲解了表单类的理解和应用。通过创建应用、配置路由,实现了登录功能,包括视图函数和模板的设计,加深了对Django表单处理流程的理解。
摘要由CSDN通过智能技术生成

前言:本文是学习网易微专业的《python全栈工程师 - Django快速建站》课程的笔记,欢迎学习交流。同时感谢老师们的精彩传授!

一、课程目标
  • 创建用户管理应用
  • 开发用户登录功能
  • 理解表单类
二、详情解读
2.1.1.表单
  • 表单用于收集不同类型的用户输入,它是一个包含表单元素的区域。表单元素是允许用户在表单中输入内容,比如:文本域(textarea)、下拉列表,单选框(radio-buttons)、复选框(checkbox)等等。表单使用表单标签<form>来设置。
<form>
用户名:<input type='text' name='username'><br>
密 码:<input type='password' name='pwd'>
</form>

在这里插入图片描述

2.1.2.请求响应流程

在这里插入图片描述

2.2.登录功能
2.2.1.创建应用
  • 用户管理应用
python manage.py startapp account
  • 实现功能:登录、退出、注册、修改密码、重置密码、个人信息。
  • 配置:./mysite/settings.py

实操:
Step1:创建应用account

python manage.py startapp account

然后往settings.py文件中添加配置:

.
.
.
INSTALLED_APPS = [
    'simpleui',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'account', # 新增这一行
]
.
.
.

Step2:添加路由,在myproject/mysite/urls.py文件中,编辑如下

rom django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls', namespace='blog')),
    # 添加下面这一行
    path('account/', include('account.urls', namespace='account')), 
]

Step3:新建路由文件myproject/account/urls.py,写入下面代码:

# -*- coding=utf-8 -*-
from django.urls import path
from . import views

app_name = 'account'

urlpatterns = [
    path('login/', views.user_login, name='user_login'),
]
2.2.2.理解表单类
  • 将表单看做对象:usename,password都是属性(字段)
<form>
用户名:<input type="text" name="username"><br/>
密 码:<inpout type="password" name="pwd">
</form>

实操: 创建文件myproject/account/forms.py,写入以下代码:

# -*- coding=utf-8 -*-
from django import forms

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

我们在交互模式中演示一下:

(mydjpro) F:\myproject>python manage.py shell
>>> from account.forms import LoginForm
>>> login_form = LoginForm()
>>> print(login_form)
<tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" required id="id_username"></td></tr>
<tr><th><label for="id_password">Password:</label></th><td><input type="password" name="password" required id="id_password"></td></tr>
>>> login_form.as_p()
'<p><label for="id_username">Username:</label> <input type="text" name="username" required id="id_username"></p>\n<p><label for="id_password">Password:</label> <input typ
e="password" name="password" required id="id_password"></p>'
>>> login_form.as_table()
'<tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" required id="id_username"></td></tr>\n<tr><th><label for="id_password">Pass
word:</label></th><td><input type="password" name="password" required id="id_password"></td></tr>'
>>> login_form.is_bound
False  # 这里 False 表示是一个空表单
>>> user = {'username': 'zhan', 'password': '123465'}
>>> admin_form = LoginForm(user)
>>> admin_form.is_bound
True  # 这里表示是一个有值的表单
>>> admin_form.is_valid()
True  # 这里表示提供的username和password值是通过验证的,下面这个是不通过验证:
>>> user1 = {'username': 'zhanyuan', 'password': ''}
>>> admin_form1 = LoginForm(user1)
>>> admin_form1.is_bound
True
>>> admin_form1.is_valid()
False  # 上面密码为空,所以这里没通过验证,返回False
>>> admin_form.cleaned_data  # 这里获取表单的值
{'username': 'zhan', 'password': '123465'}
>>> admin_form1.cleaned_data
{'username': 'zhanyuan'}
>>>
2.2.3.功能实现
  • 使用默认的用户管理应用auth: authenticate、login
  • 用户登录视图函数
    – 呈现表单:响应用户GET请求
    – 用户提交数据:响应POST请求

下面在交互模式中演示一下:

>>> from django.contrib.auth import authenticate, login
>>> user = authenticate(username='admin', password='admin')
>>> user
<User: admin>
>>> user.username
'admin'
>>> user.id
1
>>> user = authenticate(username='laowang', password='1q2w3e4r5t.')
>>> print(user) # 当数据库中没这个用户时,打印用户信息为None
None
>>>

实操:
Step1:编写用户登录的视图函数,myproject/account/views.py写入以下代码:

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm

def user_login(request):
	# GET请求渲染登录表单
    if request.method == 'GET':
        login_form = LoginForm()
        return render(request, 'account/login.html', {'form': login_form})

	# POST 请求处理登录表单提交的信息
    if request.method == 'POST':
        login_form = LoginForm(request.POST)
        if login_form.is_valid():
        	# 获取表单的数据
            cd = login_form.cleaned_data
            # 验证用户名与密码是否匹配
            user = authenticate(username = cd['username'], password=cd['password'])

            if user:
                login(request, user)
                return HttpResponse('Welcome You, You have logined the website.')
            else:
                return HttpResponse('Sorry , Your username or password is not right.')
        else:
            return HttpResponse('Invalid login.')

Step2:编辑模板文件myproject/templates/account/login.html

{% extends 'base.html' %}

{% block title %} Login {% endblock %}

{% block content %}
<div class="row text-center">
    <h1>登录</h1>
    <p>输入用户和密码</p>
    <form action="." class="form-horizontal" method="post">
    	{# 下面这句 csrf 是必备的,不然会报 403 错误 #}
        {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="登录">
    </form>
</div>
{% endblock %}

运行结果:
在这里插入图片描述

2.2.4.模板
  • ./templates/account/login.html
    {% csrf_token %}的作用
    CSRF (Cross-Site Request Forgery),跨站请求伪造
三、课程小结
  • 01.初步了解表单
  • 02.编写表单类
  • 03.实现登录功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值