1.虚拟环境+django环境(若存在用之前的)
创建一个虚拟环境 (会新建一个文件,里面有 Scripts/python.exe文件)
python -m venv myvenv
cd myvenv # 进入虚拟环境安装django库等
.\Scripts\activate.bat
pip install Django
pip install django==2.0 # 指定版本
# 下载比较慢的同学可以换个源下载
pip install django==2.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
2.创建django项目和app应用程序
创建好项目,就可以用pytharm打开了
# 自己找个位置(运行时,还需要时虚拟环境哈)
python -m django startproject <projectname> (会在当前目录下创建项目)
django-admin startproject <projectname>
设置好pytharm使用到的 python环境。
3.运行命令
python manage.py runserver 默认8000端口 ( python .\manage.py runserver)
python manage.py runserver 0.0.0.0:8888 指定端口
或者创建应用,来看看环境成功没有
创建好项目侯,就可以用pycharm打开了
#在项目目录中
python manage.py startapp <appname>
或者:
python -m django startapp demo
这里运行时,可以能遇到问题:
1.Python 3.10中已经将collections.Iterable改为typing.Iterable,而Django 2.2和以前的版本中使用了collections.Iterator,因此无法兼容Python 3.11。
需要升级到Django 3.2以上的版本,因为Django 3.2中已经对Python 3.11进行了兼容性修复。
pip install --upgrade django
pip uninstall django
pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple (下载3.2以上的)
注册应用
在公共目录setting中的INSTALLED_APPS添加 新增的<appname>
或者写成 polls.apps.PollsConfig (可以去复制,按住ctrl+C + shift + alt)
3.定义路由urls 和函数视图views
路径和视图函数举例
视图函数中,必须要返回HttpResponse对象,或子类的对象
如上图:
a应用内views.py中
from django.http import HttpResponse
def index(request): #用一个参数来接收,随便写,一般写成request
return HttpResponse("冲击40W")
b.外部urls中
导入方式有两种:
from demo应用名 import views
或者from demo.views import index 具体的
urlpatterns = [
path("admin/", admin.site.urls),
path('index/',views.index), #后面不用 加括号了
]
c.启动服务器,后可以查看效果
1.python manage.py runserver 9090 # 也可以不指定端口
2.访问http://127.0.0.1:9090/index/
注意:定义了url后,默认的欢迎页,就没有了
urls传递参数
urls.py中,views视图中。
这样就实现了,再访问路由的时候,把一些值传给了视图函数
urls.py中
path('jobs/<int:job_id>',views.detail)
# views中,视图函数要接收这个参数。 第二个参数名要何 url中定义的一样
def detail(request,job_id):
return HttpResponse(f"you are looking at question {job_id}")
4.统一应用的路由前缀
实现机制:
path中,第二个参数为 include(),就会去找子路由。
若一个项目中,有多个app应用,每个app应用都有自己的url,若写在一块,会比较臃肿
a.应用内要新建一个urls文件
b.外部的urls文件中使用include引用应用内的urls文件
应用内的urls.py也可以不导入了
效果如下
这个也可以看效果
4.前后端不分离的
定义路由+视图+html模板__常用模板语法
a.修改视图,使用render渲染html模板
第二个参数会自动识别 templates文件中的html文件
或者这么写
b.在应用内,新建一个文件templates(django会识别这个文件), 里面添加一个html文件,访问看效果:
views 中
def index(request): #用一个参数来接收,随便写,一般写成request
# return HttpResponse("冲击40W")
sutdents =["小王","小李"]
return render(request,'molingli.html',{'students':sutdents})
templates文件下,molingli.html
{% if students %}
<ul>
{% for student in students %}
<li><a href="">{{ student }}</a></li>
{% endfor %}
</ul>
{% else %}
<p> no polls are available</p>
{% endif %}
模板引入css+js静态文件
1.在应用内放入静态资源 static, 保持如下格式就行,按格式添加一个test.css
2.html文件中载入静态文件的目录,要点:
{% load static %} 写在顶部
css文件载入(head头部中)识别哪个css文件
<link href="{% static 'assets/css/test.css' %}" rel="stylesheet" />
js文件的载入(body中尾部)识别哪个js文件
<script src="{% static 'assets/js/test.js' %} "></script>
如下图
html中的标签如下
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="{% static 'assets/css/test.css' %}" rel="stylesheet" />
<style>h1 {color: blue;text-align: center;}</style>
</head>
<body>
<a href="" class="btn btn-info navbar-right">添加发布会</a>
<h1>这个【蓝色】是html中通过style标签写的CSS</h1>
<h2>这个【绿色】样式来自静态文件中的CSS文件</h2>
{# class为 test的 就是红色 #}
<p >{{ students }}</p>
{% for s in students %}
<p class="red_clolor">{{ s }}</p>
{% endfor %}
<script src="{% static 'assets/js/custom-scripts.js' %} "></script>
</body>
</html>
test.css文件如下(.test 这些是CSS选择器,如.test表示 ,class 为test的就要符合此样式)
.red_clolor{
background-color: red;
}
h2 {
color: green;
text-align: center;
}
模板的继承
子模板中写法
使用{% extends "molingli.html" %} 继承 molingli,html 页面
5.数据库概念ORM操作
数据库迁移命令
一个类就是一个表,一个对象就是一条数据
创建好类后,用如下命令,把表同步到数据库。
# 生成迁移文件(此时还没操作数据库)如果确定是哪个应用的,就可以加应用名
python manage.py makemigrations [应用名称] # 如果命令不行后面加个应用名
# 同步数据库 (操作了数据库)
python manage.py migrate
setting中配置数据库如mysql
数据库配置在setting中,如下
代码:
新增一个mysql数据库
如果配置不写 test部门, 新建数据库默认要 utf8mb4 和 utf8_general_ci
-
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'polls', # 数据库名 'USER': 'root', # 用户名 'PASSWORD': 'qwe369', # 密码 'HOST': '127.0.0.1', 'PORT': '3306', 'TEST':{ 'CHARSET': 'utf8', 'COLLATION': 'utf8_general_ci', } } }
修改后,需要安装第三方库 pip install pymysql,(django 3 不要用pymysql了?)
新版本的要装库: pip install mysqlclient
并且需要修改连接数据库的连接需要的库, 在 mysite(应用) \ 的 __init__.py中
import pymysql
pymysql.install_as_MySQLdb()
关系表举例
1.例子:老师表和班级表(一个老师只能在一个班级)(多余1关系)
这个时候setting中注册了应用就起作用了
from django.db import models
# Create your models here.
class Grade(models.Model):
num= models.CharField(max_length=64,unique=True)
def __str__(self):
return self.num
class Teacher(models.Model):
name= models.CharField(max_length=64)
grade = models.ForeignKey(Grade,on_delete=models.CASCADE)
def __str__(self):
return self.name
使用菜单中tool中的东西 ctrl alt R 使用 python manage控制台
可以快速的使用命令
创建好后,这里就有表了
注意: 第一次 migrate时,不要加 应用名,需要吧基础的东西放过去
如:基础放过去了,才能 createuser
模型表注册到admin
admin.py中注册表,启动服务,就能在admin中查看数据库了
配置setting文件(admin语言等)
补充:默认看到的页面是英文的,可以配置,配置后变成中文
修改setting文件
方式1
LANGUAGE_CODE = "zh-hans" # 默认 "en-us" # LANGUAGE_CODE = "en-us" TIME_ZONE = "Asia/Shanghai" # 默认 UTC USE_TZ=False 是否使用UTC时间,不使用就是用本地时间
方式2:
应该在配置文件 settings.py
中 MIDDLEWARE
最后加入如下配置
加一排 'django.middleware.locale.LocaleMiddleware', # admin界面语言本地化
创建用户命令
创建管理员:(创建后才能进入admin页面)
-
python manage.py createsuperuser
taoke
taoke@qq.com
123456
在admin页面中新增班级和老师
在添加老师时,就能发现一个老师只能选一个班级
多对多关系表举例
例子二:班级和学生(假设学生可以参加多个班级)多对多关系
则使用外键ManyToManyField
定义在逻辑发起方:学生参与班级,即学生表
同样,在admin注册
班级,老师,学生model类如下
class Grade(models.Model):
#班级如:1班、2班
num=models.CharField(max_length=64,unique=True)
def __str__(self):
return self.num
class Teacher(models.Model):
#姓名
name=models.CharField(max_length=64)
#老师所在班级
grade=models.ForeignKey(Grade,on_delete=models.CASCADE)
def __str__(self):
return self.name
class Student(models.Model):
#姓名
name=models.CharField(max_length=64)
#班级
grades=models.ManyToManyField(Grade,through='Student_grade_rel') #through写关系表的类名
#关系表,学生和它是多对1,班级和它也是多对1
class Student_grade_rel(models.Model):
#学生
sutent = models.ForeignKey(Student, on_delete=models.CASCADE)
grade = models.ForeignKey(Grade, on_delete=models.CASCADE)
# 新增字段---某学生在该班的排名
rank = models.IntegerField()
#命名关系表
class Meta:
db_table = 'sign_guest_events'
新增学生,可以看到学生表中,只有一个字段,另一个多对对关系的字段,是通过关系表关联的
配置关联表
补充:orm简单的操作和 url参数的传递
模型的继承
补充: 在项目中,可以创建 一个 叫common的应用,在里面存放一些公共的表的定义。
详见:OMR创建表_omr python_A~taoker的博客-CSDN博客
八、响应的整理:
第一种:HttpResponse
返回字符串的 from django.http import HttpResponse
可以把字典转化成json字符串,就可以用HttpResponse 返回了
其他参数:
- content_type 响应体格式
- status: 响应状态码 200的, 400 , 555(不存在的浏览器会显示不认识)
第二种:JsonResponse
from django.http import HttpResponse,JsonResponse return JsonResponse(project_data,json_dumps_params={'ensure_ascii':False})
它是基础 HttpRespose的
#json_dumps_params 有中文,可以加这个参数
如果,不是字典,如果时字典套字典,就加一个safe=False ,
参数1:第一个需要是字典,或者是列表,如果是querySet列表对象,就需要用list转化一下
参数2: safe =False 如果是字典套字典,就加这个参数
参数3: json_dumps_params=False 有中文,可以加这个参数
第三种: render
from django.shortcuts import render
注:views中的 {students: students}
和html中的 students,写法要一样, 但实际的内容是 后面的值。
第四种:Response (restFramework 的)
功能比Jsonresponse强大,还能根据不同的配置进行响应渲染,详见
九:使用技巧
1. 命令使用帮助
python .\manage.py help 命令的帮助
python .\manage.py startapp -h 创建应用-h 查看具体的帮助
2.使用python manage.py 命令控制台:
可以不用输入 pythonmanage.py ,还能智能提示
专业版本pytcharm tools,还可以使用快捷键
3.快速启动
4. pycharm 工具使用
ctrl+D,快速复制一行
复制路径: ctrl + c +shift + alt
知识点小结:
1.views.py视图函数中需要带一个参数,习惯把它些成了request
2.HttpResponse是django.http的一个东西,可以直接返回内容到浏览器上
3.render 可用来渲染html模板,并且可以给模板传值
4.html文件中的模板语法
- 使用变量 {{ }}
- for循环 {% for i in list %} -----{% endfor%}
- if判断 {% if 条件 %}---------{% endif %}
- 列表元素个数: **list | lenth
- 载入静态文件 {% load static %}
- css文件载入(head头部中)
<link href="{% static 'assets/css/custom-styles.css' %}" rel="stylesheet" />
-
js文件的载入(body中)
<script src="{% static 'assets/js/custom-scripts.js' %} "></script>
- 父模板和子模板的插槽写法:{% block **** %} ---插槽---{ % endblock %}
- 模板继承写法:{% extends "base.html" %}
5.多对1,多对对表关系的定义。
6.url中参数传递,orm操作,获取一个数据