1.Django安装
pip install django==3
2.创建初始化环境并运行项目
初始化环境中文件的作用
启动项目
若出现这样的错误,则可能端口被占用
3.使用pycharm终端进行app创建
注:如果使用anaconda环境,运行之后没有显示文件夹,可能是没有进入对应的环境中
4. Django中文件查找的顺序
优先查找TEMPLATES,然后查找INSTALL_APPS
单独app的模板,在app中写;公共的就在最外层的templates中写html模板
INSTALLED_APPS = [ 'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'web.apps.WebConfig'
]
...
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',
],
},
},
]
5. Django视图中urls的转向三种方式
from django.shortcuts import render,HttpResponse,redirect
def login(request):
# return HttpResponse('登陆页面') #返回对应响应
# return render(request,'login.html') #返回对应的跳转页面
return redirect('https://www.baidu.com') #返回重定向界面
6. Django模板中的动态url设计
使用参数化的话可以动态传入url的参数,实现参数化
注:html中的列表或者字典的取值方式是通过 .元素 来取值的
7.静态资源
可以将静态资源保存在app文件的static目录下(需要新创建),有多个app时,需要注意寻找顺序
static的引入
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>你的名字</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}">
</head>
<body>
<div>宫水三叶</div>
<img src="{% static 'images/img.png' %}" style="width: 50px;height: 60px">
<a href="" class="btn btn-danger">删除</a>
</body>
</html>
8.小案例
输入账号密码并提交跳转到对应主页,否则提示账号密码错误
def name(request):
if request.method == 'GET':
return render(request,'name.html')
user = request.POST.get('username')
pwd = request.POST.get('password')
if user=='123' and pwd=='123':
return redirect('https://baike.baidu.com/item/%E5%AE%AB%E6%B0%B4%E4%B8%89%E5%8F%B6/20095281?fr=ge_ala')
else:
return render(request,'name.html',{'error':'账号密码错误'})
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>你的名字</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css' %}">
</head>
<body>
<div>宫水三叶</div>
<img src="{% static 'images/img.png' %}" style="width: 50px;height: 60px">
<a href="" class="btn btn-danger">删除</a>
<form action="/name/" method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="输入用户名">
<input type="password" name="password" placeholder="输入密码">
<input type="submit" value="提交">
<span style="color: red">{{ error }}</span>
</form>
</body>
</html>
9.django中的数据库使用
在web中的models.py文件中 编写数据库存储类型格式
依次执行以下两行代码
#删除表时可用
python manage.py makemigrations
#添加表时可用
python manage.py migrate
10.sqlite的使用方式
增删改查
def database(request):
from web import models
#数据增加
models.UserInfo.objects.create(username='宫水三叶',password='123',age=18)
models.UserInfo.objects.create(username='宫水四叶',password='123',age=6)
models.UserInfo.objects.create(username='滝',password='123',age=15)
models.UserInfo.objects.create(username='滝',password='123',age=15)
#数据删除
models.UserInfo.objects.filter(id=4).delete()
#数据修改
models.UserInfo.objects.filter(id=3).update(age=16)
#数据查询
#filter充当过滤器类似于sql中的where
info = models.UserInfo.objects.all()
for obj in info:
print(obj.id,obj.username,obj.age)
return HttpResponse('相应成功')
11.session和cookie的绑定
使用django自带的进行session的创建和校验
12.使用中间件优化
为了方便cookie和session的鉴权,我们使用中间插件去管理
应用场景:1.日志,获取访问时,请求的IP地址并记录到文件中。2.权限校验,有权限的返回None,无权限就返回HttpResponse(‘无权访问’)。3.登陆判断,判断用户的session中是否存储信息。
13.html中的母版继承
使用母版可以加载每个页面的公共部分节省了代码的冗余。
母版格式
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>你的名字</title>
<link rel="stylesheet" href="{% static 'plugins/bootstrap3/css/bootstrap.css' %}">
{% block css %}{% endblock %}
</head>
<body>
<div class="navbar navbar-default" style="border-radius: 0">
<div class="container-fluid container">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="https://baike.baidu.com/item/%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97%E3%80%82/19127928?fr=ge_ala">你的名字</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="/depart/list/">部门 <span class="sr-only">(current)</span></a></li>
<li><a href="/assert/list/">资产</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">One more separated link</a></li>
</ul>
</li>
</ul>
{# <form class="navbar-form navbar-left">#}
{# <div class="form-group">#}
{# <input type="text" class="form-control" placeholder="Search">#}
{# </div>#}
{# <button type="submit" class="btn btn-default">Submit</button>#}
{# </form>#}
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ username }} <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="/logout/">注销</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</div>
<div class="bs-example container" data-example-id="bordered-table">
{% block content %}{% endblock %}
</div>
<script src="{% static 'js/jquery.js' %}"></script>
<script src="{% static 'plugins/bootstrap3/js/bootstrap.js' %}"></script>
{% block js %}{% endblock %}
</body>
</html>
样式版继承
{% extends 'layout.html' %}
{% block content %}
<div style="margin-bottom: 5px">
<a class="btn btn-success">添 加</a>
</div>
<table class="table table-bordered">
<thead>
<tr>
<th>id</th>
<th>名字</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for obj in infos %}
<tr>
<td>{{ obj.id }}</td>
<td>{{ obj.title }}</td>
<td>
<a class="btn btn-primary btn-xs">编辑</a>
<a class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
14.ModelForm组件
自动生成html标签+自动读取关联数据
表单验证+错误提示+保留之前提交的数据
数据库进行:新建、修改
如果要想精确定义返回值的类型,需要将在models文件中进行修改
15. 批量处理标签样式
16. 添加标签之后自动调用表中的列名
17. 通过form快速保存信息
18.表中数据增删改时的规则判断
如果sqlite中的数据在处理时需要进行判定,则可以在clean_函数中实现
19. 数据库使用范围查询的形式
20. ORM操作
对象关系映射,主要用于跨表查询
21. 页面分页标签的封装
import copy
from django.utils.safestring import mark_safe
class Pagination(object):
def __init__(self,request,total_count):
page = request.GET.get('page','1')
if not page.isdecimal():
page = 1
else:
page = int(page)
if page<1:
page = 1
self.page = page
self.start = (page-1)*10
self.end = page*10
self.total_count = total_count
total_page,div = divmod(self.total_count,10)
if div:
total_page += 1
self.total_page = total_page
self.quert_dict = copy.deepcopy(request.GET)
self.quert_dict._mutable=True
def html(self):
page_list = []
if self.total_page<=11:
page_start = 1
page_end = self.total_page+1
else:
if self.page<=5:
page_start = 1
page_end = 11+1
else:
if self.page+5>self.total_page:
page_start = self.total_page-9
page_end = self.total_page+1
else:
page_start = self.page-5
page_end = self.page+5
for i in range(page_start,page_end+1):
self.quert_dict.setlist('page',[i])
query = self.quert_dict.urlencode()
if i == self.page:
element = '<li class="active"><a href="?{}">{}</a><li>'.format(query, i)
else:
element = '<li><a href="?{}">{}</a><li>'.format(query, i)
page_list.append(element)
page_string = mark_safe(''.join(page_list))
return page_string