b站视频:最新Python的web开发全家桶(django+前端+数据库)
web
├── manage.py # 项目的管理,包括: 启动项目,创建app, 数据管理【不要动】【很重要】
└── web
├── asgi.py # 接收网络请求【不要动】
├── __init__.py
├── settings.py # 项目配置(模板配置,数据库配置,注册app)【常常操作】
├── urls.py # url和函数的对应关系,路径【常常操作】
└── wsgi.py # 接收网络请求【不要动】
终端在当前项目目录下,输入"python manage.py startapp app名字"
查看app下的文件
app01/
├── admin.py [固定,不用动]
├── apps.py [固定,不用动]
├── __init__.py
├── migrations [固定,不用动]
│ └── __init__.py
├── models.py [重要]对数据库进行操作
├── tests.py [固定,不用动]
└── views.py [重要] 在urls里调用的函数指向这里的视图函数
应用【blog】中各个目录作用:
打开app下的apps.py文件,找到里面的类
添加到setting文件的这里
编辑views.py
里的 视图函数
from django.shortcuts import render,HttpResponse
def index(request):
return HttpResponse('welcome to Django blog!')
编辑的urls.py
来指定访问路由
前面放访问路径,后面放函数[建立路径与函数的映射关系,以后访问路径就会执行这个函数]
记得import view文件
from django.urls import path
from app01 import views
urlpatterns = [
# path("admin/", admin.site.urls),
path("index/", views.index)
]
再来一个
编辑views.py
视图函数
from django.shortcuts import render,HttpResponse
def index(request):
return HttpResponse('welcome to Django blog!')
def user_list(request):
return HttpResponse("用户列表")
编辑urls.py
来指定访问路由
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
# path("admin/", admin.site.urls),
path("index/", views.index),
path("user_list/", views.user_list),
]
总结:就是先在url里创建映射关系,然后去views里写视图函数
为了使用HTML,这里开始引入templates模板
注意: 可以在app下创建templates
目录,也可以在主目录下创建templates
目录
1.优先去项目的根目录下寻找
2.根据app的注册顺序去app的目录下templates下寻找
所以我们把刚开始配置的根目录下的templates文件夹删掉了
如果说我们从数据库中取到了数据,如何在
html
页面中进行展示呢,这里需要用到templates的基本语法
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<h1> 模版语法的学习 h1>
<h1> {{ n1 }} h1>
body>
html>
单一变量就直接用花括号,意思是传进去是什么样就显示成什么样
def tpl(request):
name = "丸子"
roles = ["管理员","CEO","保安"]
return render(request, "tpl.html", {"n1":name,"n2":roles})
<div> {{ n2.0}} div>
<div> {{ n2.1}} div>
<div> {{ n2.2}} div>
里面元素太多了,一个一个索引显然不方便,就可以用循环,有点像java里的el表达式
<div>
列表循环:
{% for item in n2 %}
<span>{{ item }}span>
{% endfor %}
div>
修改views.py
def tpl(request):
name = "丸子"
roles = ["管理员","CEO","保安"]
user_info = {"name": "张三", "age": 25, "sex": "男"}
return render(request, "tpl.html", {"n1":name,"n2":roles,"n3":user_info})
修改tpl.html
,根据键取获取值
<div>
{{ n3 }}<br>
{{ n3.name }}
{{ n3.age }}
{{ n3.sex }}
div>
获取值
values
{% for v in n3.values %}
{{ v }}
{% endfor %}
获取键
keys
{% for k in n3.keys %}
{{ k }}
{% endfor %}
获取键和值
items
{% for k,v in n3.items %}
{{ k }} = {{ v }}
{% endfor %}
修改视图函数
def tpl(request):
name = "丸子"
roles = ["管理员","CEO","保安"]
user_info = {"name": "张三", "age": 25, "sex": "男"}
user_list = [
{"name": "张三", "age": 25, "sex": "男"},
{"name": "李四", "age": 18, "sex": "男"},
{"name": "王五", "age": 22, "sex": "女"},
]
return render(request, "tpl.html", {"n1":name,"n2":roles,"n3":user_info,"n4":user_list})
修改html
{% for item in n4 %}
{{ item.name }} {{ item.age }} {{ item.sex }}
{% endfor %}
{% if n1 == "poker" %}
嘿嘿嘿
{% elif n1 == "toker" %}
哈哈哈
{% else %}
呵呵呵
{% endif %}
本质上:模版语法是在HTML中写一些占位符,由数据对这些占位符进行替换和处理
重定向: 浏览器向某个网站发送请求,网站返回给浏览器一个新的URL,浏览器去访问这个新的URL地址
def something(request):
# request是一个对象,封装了用户发送过来的所有请求相关的数据
# 1. [请求]获取请求方式 GET/POST
print(request.method)
# 2. [请求]在URL上传递值
print(request.GET)
# 3. [请求]在请求体中提交数据
print(request.POST)
# 4. [响应] HttpResponse("返回内容"),内容字符串内容返回给请求者
# return HttpResponse("返回内容")
# 5. [响应] 读取HTML的内容+渲染(替换)->字符串,返回给用户浏览器
return render(request,"something.html",{"title":"来了"})
# 6. [响应] 让浏览器重定向到其他的页面
return redirect("https://www.baidu.com")
修改views.py
,新增login
函数
def login(request):
if request.method == "GET":
return render(request, "login.html")
# 如果是 POST 请求,获取用户提交的数据
print(request.POST)
username = request.POST.get("user")
password = request.POST.get("password")
if username == "poker" and password == "123":
return HttpResponse("登录成功")
#return HttpResponse("登录失败")
return render(request, "login.html", {"error_msg": "用户名或密码错误"})
url里增加login
path('login/', views.login),
在templates
下新建login.html
Document
用户登录
Django开发数据库更简单,内部提供了ORM框架
ORM可以帮助我们做两件事:
首先在数据库里创建一个database
create database mydb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
然后在settings.py进行配置和修改
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'mydb',
'USER':'root',
'PASSWORD':'Syz123!@#',
'HOST':'127.0.0.1',
'PORT':'3306',
}
}
配置app01下的models.py
会根据自定义的类创建跟app同名的表
from django.db import models
# Create your models here.
class UserInfo(models.Model):
name = models.CharField(max_length=20)
password = models.CharField(max_length=20)
age = models.IntegerField()
create table app01_userInfo(
id bigint auto_increment primary key,
name varchar(20),
password varchar(20),
age int
)
python3 manage.py makemigrations
python3 manage.py migrate
想再创建一个表,就在models.py里再写一个类,再调用那两条命令
想删除表,就把相应的类删除或者注释,再调用那两条命令
想删除列,就把那条列的代码删除或注释,再调用那两条命令
如果想添加列,这时候就要注意,如果说表中本身有数据,那这是增加的列该是什么数据呢?
It is impossible to add a non-nullable field 'size' to userinfo without specifying a default. This is because the database needs something to populate existing rows.
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit and manually define a default value in models.py.
Select an option:
age = models.IntegerField(default=2)
data = models.IntegerField(null=True, blank=True)
from app01.models import UserInfo
...
def orm(request):
# 新建数据
UserInfo.objects.create(name="poker", password="123", age=25)
UserInfo.objects.create(name="roker", password="456", age=30)
return HttpResponse("成功")
# 删除数据
UserInfo.objects.filter(id=2).delete()
# 删除表中所有数据
UserInfo.objects.all().delete()
data_list = UserInfo.objects.all()
print(data_list)
for obj in data_list:
print(obj.id, obj.name, obj.password, obj.age)
UserInfo.objects.filter(name="roker").update(age=35)