Django
安装
pip install Django=1.11.4
验证
python
import django
django.get_version()
升级Django
pip install -U Django
创建项目
1.创建文件夹
2.cmd到文件夹下
3.创建admin文件夹
django-admin startproject project
4.查看树状层级
tree . /F
manage.py
一个命令行工具,可以使我们用多种方法对Django项目进行交互
_ init _.py
一个空文件,告诉Python这个项目应该被看做一个python包
settings.py
项目的配置文件
urls.py
项目的URL声明
wsgi.py
项目与WSGI兼容的WEB服务器入口
Django默认的数据库
默认使用sqlite3
在settings.py文件里,通过databases选项进行数据库配置
创建app
python manage.py startapp myApp #如果报错可能是python版本和django不兼容,升级django版本
admin.py 站点配置
models.py 模型
views.py 视图
激活应用
在settings.py文件中,将myapp加入到INSTALLED_APPS当中
定义模型
在models.py文件中定义模型
from django.db import models
模型类要继承models.Model类
定义一个简单的模型
在数据库中生成数据表
1. 生成迁移文件
生成迁移文件的报错:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
需要在关联语句上加上:
sgrade = models.ForeignKey("Grades",on_delete=models.DO_NOTHING)
具体参数:
https://blog.csdn.net/m0_38109046/article/details/82660038
在migrations目录下生成一个迁移文件,此时数据库还没有表
2.执行迁移
相当于执行sql语句创建数据表
3.如果有新的表
再执行一次上两个命令,
4.如果有新的字段
最好删除数据库和
再执行上面的两句命令
测试操作数据
查询所有数据
使用utf-8编码的cmd
chcp 65001
引入包
就能进入管理界面
导入包
from myApp.models import Grades,Students
from django.utils import timezone
from datetime import *
报错:
warnings.warn("DateTimeField %s received a naive datetime (%s)"
解决:
https://www.cnblogs.com/sewen-H/p/13452819.html
报错2:
pymysql.err.IntegrityError: (1048, "Column 'isDelete' cannot be null")
解决:
设置值
在 python shell里添加数据
Grades.objects.all()
grade1 = Grades()
grade1.gname = "python02"
grade1.gdate =timezone.now()
grade1.ggirlnum = 12
grade1.gboynum = 5
grade1.isDelete = 0
grade1.save()
在数据库里查看
重新登录后,需要重新导入包返回值就不一样了
查看第二个数据
>>> Grades.objects.get(pk=2)
<Grades: python02-12-5>
修改数据
模型对象.属性 = 新值
>>> grade1.gboynum = 60
>>> grade1.save()
删除数据
模型对象删除 (物理山粗,数据库中的表里的数据被删除了)
grade1.delete()
关联对象
>>> grade1 = Grades.objects.get(pk=1)
>>> stu = Students()
>>> stu.sname = "wangmeng"
>>> stu.gender = False
>>> stu.sage = 20
>>> stu.scontend = "wojiaowangmeng"
>>> stu.isDelete = 0
>>> stu.sgrade = grade1
>>> stu.save()
获得关联对象的集合
需求:
获取python01班级的所有学生
再存一个人
>>> stu2 = Students()
>>> stu2.sname = "wangmeng "
>>> stu2.gender = False
>>> stu2.sage = 20
>>> stu2.scontend = "wo jiao wang meng"
>>> stu2.isDelete = 0
>>> stu2.sgrade = grade1
>>> stu2.save()
>>> grade1.students_set.all()
格式:
对象名.关联的类名小写_set.all()
需求:
创建一个同学,属于python01班
>>> stu3 = grade1.students_set.create(sname=u'laji',sgender=True,scontend='wo jiao',sage=32,isDelete=0)
>>> stu3
<Students: Students object (3)>
启动服务器
格式:
python manage.py runserver ip:port
ip可以不写,不写代表本机ip。
端口号默认8000
本机测试
python manage.py runserver
说明
这是一个纯python写的轻量级web服务器,仅仅在开发测试中使用
Admin站点管理
概述
内容发布
负责添加、修改、删除内容数据库
公告访问
配置Admin应用
在settings.py 文件中的INSTALLED_APPS中添加'django.contrib.admin',默认是已经添加好的
创建管理员用户
汉化
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
不用重启服务,直接刷新就可以了
管理数据表
修改admin.py文件
from.models import Grades,Students
#注册
admin.site.register(Grades)
admin.site.register(Students)
自定义管理页面
属性说明
# 列表页属性
list_display = ['pk','gname','gdate','ggirlnum','gboynum','isDelete'] #显示字段
list_filter = ['gname'] #过滤字段
#search_fields = ['gname'] # 搜索字段
list_per_page = 5 #分页
# 添加、修改页属性
#fields = ['ggirlnum','gboynum','gname','gdate','isDelete'] #规定属性的先后顺序
fieldsets = [
("num",{"fields":['ggirlnum','gboynum']}),
("base",{"fields":['gname','gdate','isDelete']}),
] #给属性添加分组 !!!这两个不能同时使用!!!
关联对象
需求:
在创建一个班级时,可以直接添加几个学生
在admin.py(视图管理)
效果:
布尔值显示问题(显示男女)
效果:
#设置页面列的名称
gender.short_description = '性别'
执行动作的位置
效果:
视图的基本使用
概述:
在django中,视图对web请求进行回应
视图就是一个python函数,在views.py文件中定义
定义视图
在views.py文件
一个简易定义视图
from django.http import HttpResponse
# request就是请求体
def index(request):
return HttpResponse('i am so fucking good')
配置url
修改project目录下的urls.py文件
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
urlpatterns = [
path('admin/', admin.site.urls),
#url(r'^admin/', admin.site.urls),
url(r'', include('myApp.urls')),
]
project的urls.py指向myApp里的urls.py文件
在myApp应用目录下创建一个urls.py文件
from django.conf.urls import url
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
# path('',views.index)
url(r'^$', views.index)
]
效果:
views.py
from django.http import HttpResponse
# request就是请求体
def index(request):
return HttpResponse("i am a good man")
def detail(request,num,num2):
return HttpResponse("detail-%s-%s" %(num,num2))
myApp\urls.py
from django.conf.urls import url
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
# path('',views.index)
url(r'^$', views.index),
url(r'^(\d+)/(\d+)$', views.detail),
]
效果:
模板的基本使用
概述:
模板是HTML页面,可以根据视图中传递过来的数据进行填充
创建模板目录:
创建templates目录,在目录下创建对应项目的模板目录(project/templates/myApp)
配置模板路径:
修改settings.py文件下的TEMPLATES
定义grades.html和students.html的模板:
模板语法:
{{输出值,可以是变量,也可以是对象.属性}}
{{%执行代码段%}}
写grades.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级信息</title>
</head>
<body>
<h1>班级信息列表</h1>
<u1>
<!--python04,python05,python06-->
{%for grade in grades%}
<li>
<!--创建一个循环,每一次循环创建要给li-->
<a href="{{grade.id}}">{{grade.gname}}
<!--拿的models.py里的对象-->
</a>
</li>
{%endfor%}
</u1>
</body>
</html>
写myApp\urls.py(配置url)
from django.conf.urls import url
from django.contrib import admin
from django.urls import path
from . import views
urlpatterns = [
# path('',views.index)
url(r'^$', views.index),
url(r'^(\d+)/(\d+)$', views.detail),
url(r'^grades/$', views.grades),
url(r'^students/$', views.students),
url(r'^grades/(\d+)$' , views.gradesStudents)
]
写views.py(定义视图)
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
# request就是请求体
def index(request):
return HttpResponse("i am a good man")
def detail(request,num,num2):
return HttpResponse("detail-%s-%s" %(num,num2))
from .models import Grades,Students
def grades(request):
#去模板里取数据
gradeList = Grades.objects.all()
#将数据传递给模板,模板再渲染页面,再将渲染好的页面返回给游览器
return render(request,'myApp/grades.html' , {"grades":gradeList})
def students(request):
studentList = Students.objects.all()
return render(request,'myApp/students.html' , {"students":studentList})
def gradesStudents(request,num):
grade = Grades.objects.get(pk=num)
studentsList = grade.students_set.all()
return render(request,'myApp/students.html', {"students":studentsList})
复制的项目如何使用
1.复制
2.删除迁移的001文件
3.在settings.py里改数据库(数据库名,数据库密码)
4.在数据库中创建对应的数据库
5.重新生成迁移文件
6.执行迁移
7.启动数据库
8.测试
如何加入css样式
1.建立静态文件的文件夹
2.配置文件夹为项目的合法静态文件夹
settings.py
#静态文件的访问URL
STATIC_URL = '/static/'
#配置静态文件夹
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
3.在游览器上查看是否能访问静态文件夹里的文件和css样式
4.修改html