本章节介绍django的表单功能,通过表单实现用户登陆认证。
通过定义一个django的form表单,将form表单映射生成html前端的form表单组件。
初始化新项目,创建项目mysite与myapp,配置templates,INSTALL,urls.py等
#创建数据库与用户
[root@localhost 0.22]# mysql -uroot -p
Enter password:
MariaDB [(none)]> create database mysite2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
MariaDB [(none)]> grant all on mysite2.* to 'mysite2'@'%' identified by 'mypassword';
#创建项目mysite
[root@localhost 0.22]# django-admin startproject mysite
#修改settings.py
[root@localhost mysite]# mkdir templates/
[root@localhost mysite]# vim mysite/settings.py
ALLOWED_HOSTS = ['*']
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite2',
'USER': 'mysite2',
'PASSWORD':'mypassword',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
#创建应用myapp
[root@localhost mysite]# python3 manage.py startapp myapp
#django安装app
[root@localhost mysite]# vim mysite/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
[root@localhost mysite]# vim myapp/forms.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
[root@localhost mysite]# vim myapp/views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from myapp.forms import LoginForm
def myapp_login(request):
if request.method == "POST":
login_form = LoginForm(request.POST)
if login_form.is_valid():
formdata = login_form.cleaned_data
user = authenticate(username=formdata['username'],password=formdata['password'])
if user:
login(request,user)
return HttpResponse('登录成功')
else:
return HttpResponse('认证失败')
else:
return HttpResponse("输入不合法")
if request.method == "GET":
login_form = LoginForm()
return render(request,'myapp_login.html',{"forms":login_form})
[root@localhost mysite]# vim templates/myapp_login.html
<!DOCTYPE html>
<html>
<head>
<title>django</title>
</head>
<body>
<p>用户登陆</p>
<form action={% url 'myapp_login' %} method="post">
{% csrf_token %}
{{ forms.as_p }}
<input type="submit" value="登陆">
</form>
</body>
</html>
forms表单的渲染选项有.as_p .as_table .as_ul
[root@localhost mysite]# vim mysite/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('myapp/',include('myapp.urls')),
path('admin/', admin.site.urls),
]
[root@localhost mysite]# vim myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('myapp_login', views.myapp_login, name='myapp_login'),
]
#因为没有创建新的model,不需要makemigrations生成迁移文件,直接迁移。
[root@localhost mysite]# python3 manage.py migrate
#创建超级用户
[root@localhost mysite]# python3 manage.py createsuperuser
Username (leave blank to use 'root'):
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
通过python3 manage.py runserver 0.0.0.0:80命令运行django,访问你的IP:PORT/myapp/myapp_login ,输入账户root和密码验证登陆效果。
没有css样式的form表单非常难看,通过加载bootstrap的css样式,来美化form表单。先修改form表单定义:
[root@localhost mysite]# vim myapp/forms.py
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'}))
password = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'}))
修改模板文件
[root@localhost mysite]# vim templates/myapp_login.html
<!DOCTYPE html>
<html>
<head>
<title>django</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<p>用户登陆</p>
<form action={% url 'myapp_login' %} method="post">
{% csrf_token %}
<div class="form-group">
{{ forms.username.label_tag }}
{{ forms.username }}
</div>
<div class="form-group">
{{ forms.password.label_tag }}
{{ forms.password }}
</div>
<button type="submit" class="btn btn-default">登陆</button>
</form>
</body>
</html>
再次访问登陆页面查看效果。可以看到django的form表单已经加载了bootstrap的css样式。
修改url配置
[root@localhost mysite]# vim mysite/urls.py
from django.contrib import admin
from django.urls import path, include
from mysite.views import index
urlpatterns = [
path('myapp/',include('myapp.urls')),
path('admin/', admin.site.urls),
path('', index),
]
[root@localhost mysite]# vim myapp/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('myapp_login', views.myapp_login, name='myapp_login'),
path('myapp_logout', views.myapp_logout, name='myapp_logout'),
]
修改视图函数
[root@localhost mysite]# vim myapp/views.py
from django.shortcuts import render ,redirect
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from myapp.forms import LoginForm
from django.contrib.auth import logout
def myapp_login(request):
if request.method == "POST":
login_form = LoginForm(request.POST)
if login_form.is_valid():
formdata = login_form.cleaned_data
user = authenticate(username=formdata['username'],password=formdata['password'])
if user:
login(request,user)
request.session['user_id']=user.id
return redirect('/')
else:
return HttpResponse('认证失败')
else:
return HttpResponse("输入不合法")
if request.method == "GET":
login_form = LoginForm()
return render(request,'myapp_login.html',{"forms":login_form})
def myapp_logout(request):
print(request.session.get('user_id'))
logout(request)
return redirect('/myapp/myapp_login')
[root@localhost mysite]# vim mysite/views.py
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
@login_required
def index(request):
print(request.session.get('user_id'))
return render(request,'index.html')
创建模板文件
[root@localhost mysite]# vim templates/index.html
<!DOCTYPE html>
<html>
<head>
<title>django</title>
</head>
<body>
<p>index首页</p>
{{ request.user.username }}
</br>
<a href="{% url 'myapp_logout' %}">Logout</a>
</body>
</html>
修改settings.py文件
[root@localhost mysite]# vim mysite/settings.py
LOGIN_URL = '/myapp/myapp_login' #<--新增加一行,用来做@login_required跳转
运行django,登陆后查看控制台输出的日志。