django-admin startproject pyweb
pyweb 文件下包含一个同名文件夹和manage.py
manage.py可以理解是网站的管理脚本,同名文件夹功能可以理解为对网站内容的控制
python manage.py startapp web
python manage.py runserver
python manage.py migrate #根据提示重建表结构
在pyweb\pyweb\settings.py中注册app,添加’web.apps.WebConfig’的字段:
# Application definition
#应用定义
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#注册app,连接的是web/apps.py 文件中的WebConfig类(创建的名字不同,类名也不同)
'web.apps.WebConfig',
]
Django设计app的核心理念是功能的模块化和可重用。
首先要打开数据库,建立一个本次项目的数据库
create database web;
配置数据库(修改pyweb\pyweb\settings.py配置信息):
注释掉原始数据库配置,删除数据文件pyweb\db.sqlite3
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': BASE_DIR / 'db.sqlite3',
# }
# }
#mysql database
# 添加的内容
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'web',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': 'root'
}
}
保证这两个操作mysql 的模块已经安装
pip install mysqlclient
pip install pymysql
在\pyweb\web\models.py中建表:
文件中每个class相当于单个数据库表,每个属性也是这个表中的一个字段。 属性名就是字段名,它的类型(例如 #CharField )相当于数据库的字段类型 (例如 varchar )。
from django.db import models
# Create your models here.
#文件中每个class相当于单个数据库表,每个属性也是这个表中的一个字段。 属性名就是字段名,它的类型(例如 #CharField )相当于数据库的字段类型 (例如 varchar )。
class Company(models.Model):
"""公司表"""
#ID 字段可以自动生成
companyname = models.CharField(verbose_name='公司名称',max_length=64,null=False)
class Userinfo(models.Model):
"""人员信息"""
name = models.CharField(verbose_name='姓名',max_length=32)
password = models.CharField(verbose_name='密码',max_length=64)
age = models.IntegerField(verbose_name='年龄')
sign = models.CharField(verbose_name='签名',max_length=255)
# 绑定外键并级联删除,删除公司时删除属于公司的所有人
companyinfo = models.ForeignKey(verbose_name='公司',to='company',to_field='id',on_delete=models.CASCADE)
# # 绑定外键删除置空
# companyinfo = models.ForeignKey(to='companyname',to_field='id',null=True,blank=True,on_delete=models.SET_NULL)
gender_choices = (
(1,'男'),
(2,'女'),
)
gender = models.SmallIntegerField(verbose_name='性别',choices = gender_choices)
生成数据表:
1、生成迁移文件(在终端执行如下命令)
python manage.py makemigrations
2、执行迁移文件(在终端执行如下命令)
python manage.py migrate
得到如下表,除了我们要的两表,其他表都是系统生成的:
在web_userinfo表中插入几条记录,登录页面的验证主要用到name和password字段:
insert into web_userinfo(name,password,age,sign,gender,companyinfo_id) values ('肖战','00000',20,'haha',2,1);
insert into web_userinfo(name,password,age,sign,gender,companyinfo_id) values ('南藤','11111',29,'萨瓦迪卡',2,2);
insert into web_userinfo(name,password,age,sign,gender,companyinfo_id) values ('giao','22222',29,'开心你就拍手',2,2);
先放出页面效果
关联页面要用到pyweb\pyweb\urls.py 和 pyweb\web\views.py 两个文件(假设我们已经有了login.html页面)。
1.先做网站目录链接到函数的部分url.py
from django.contrib import admin
from django.urls import path
# 必须先导入web/views
from web import views
urlpatterns = [
# path('admin/', admin.site.urls),
# 把网站地址和要执行函数建立对应关系
path('login/',views.login),
]
2.再把函数和login.html页面相关连
from django.shortcuts import render
#导入重定向redirect为了测试
from django.shortcuts import redirect
#导入models为了操作数据库
from web import models
# Create your views here.
def login(request):
return render(request,'login.html')
3.做一个login.html页面,我们要先建一个templates文件夹来放html文件(还有static文件夹来放有关html的文件,例如img,css,js等),就像这样,然后login.html新建在templates文件夹下即可。
简单构建一个页面,表单form中添加三个div,并增大间距代码让login.html结构更清晰
DOCTYPE html>
<html>
<head>
<title>Japan_is_shittitle>
head>
<body>
<div>
<h2>用户登陆h2>
<form method="post">
{% csrf_token %}
<div>
<label>用户名label>
<div>
<input type="" name="user">
div>
div>
<div>
<label>密码label>
<div>
<input type="" name="pwd">
div>
div>
<div>
<div>
<span>{{error_msg}}span>
<button>登录button>
div>
div>
form>
div>
body>
html>
到这为止,访问http://127.0.0.1:8000/login/
就可以访问到login.html页面。
4.接下来在views.py的login函数中写登录的逻辑
from django.shortcuts import render,redirect
#导入models为了操作数据库
from web import models
# Create your views here.
def login(request):
# 如果请求方式是get,就返回本页面,否则(post方式)就获取页面提交的内容
# 和数据库的用户名/密码做对比,相同就登录,不同就报错
if request.method == "GET":
return render(request,'login.html')
#user对应html文件输入框,pwd同理
name = request.POST.get('user')
pwd = request.POST.get('pwd')
#从数据库web中的web_userinfo表中取出所有数据
data_list = models.Userinfo.objects.all()
# 从每条数据中取得name和password字段进行比较
for data in data_list:
if data.name == name and data.password ==pwd:
# 登录成功跳转到我主页
return redirect('https://blog.csdn.net/qq_43504837')
# 登录不成功就返回本页面,并给出错误信息
return render(request,'login.html',{"error_msg":"用户名或错误"})
让我们再看看数据库web_userinfo表中的数据,这时用他们的name和password就可以登录了(指跳转至我主页)
下篇把登录页面的css实现一下,加入用户认证和图片验证码。
背景图片链接
孤勇者 双城之战 金克丝 厚涂 孤勇者4k壁纸—原图
孤勇者 双城之战 金克丝 厚涂 孤勇者4k壁纸—使用图