资源

点击这里

个人项目

简易博客搭建

环境安装

python = 3.12 Django = 5.0.3

版本一定要对应,否则项目创建是不会成功的

项目运行

  1. 命令行 python manage py runserver
  2. pycharm 直接运行整个项目

default 默认端口号为8000,也可以通过http://127.0.0.1:8000/来访问

项目结构介绍

  1. manage.py : 项目交互基本都是基于这个文件,一般不要动它。
  2. settings.py : 项目的设置,以后所有的配置都在这里
  3. urls.py : 配置路由
  4. wsgi.py : 项目与wsgi协议兼容的web服务器入口,部署的时候需要使用,一般不要动它。
  5. appDjango的组成部分,相当于一个小模块。创建语句python manage.py startapp name

url 和视图的映射

urls.py下,举一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.contrib import admin
from django.urls import path
from django.shortcuts import HttpResponse

def index(request):
return HttpResponse("welcome to djangoProject")
#视图函数一般不写在这个文件里,只是单纯举一个例子。
#规范要写在app里面的views.py

urlpatterns = [
path("admin/", admin.site.urls),
path("",index)
]

url 的两种传参
在views.py下写视图函数,同时配置路由

1
2
3
4
5
6
7
8
9
10
# 1.查询字符串的方式,get请求
# http://127.0.0.1:8000/book?id=3&name=123123
def book_details(request):
bookid = request.GET.get('id')
name = request.GET.get('name')
return HttpResponse(f'bookid:{bookid},{name}')

# http://127.0.0.1:8000/book/1
def book_details_path(request,book_id):
return HttpResponse(f'bookid:{book_id}')

配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from django.contrib import admin
from django.urls import path,include
from django.shortcuts import HttpResponse
from book import views

def index(request):
return HttpResponse("welcome to djangoProject")

app_name = 'text'

urlpatterns = [
path("admin/", admin.site.urls),
path("book/",views.book_details),

# 可以指定类型,限制输入str,slug,uuid,path
# path("book/", include("book.urls"))可以统一管理
path("book/<int:book_id>",views.book_details_path)
]
  • str : 非空字符串类型,但是不能包含斜杠
  • int : int
  • slug : 由英文中的横杠-,或者下划线连接英文字符串或者数字组成的字符串
  • uuid : 匹配uuid字符串
  • path : 匹配非空字符串类型,可以包含斜杠

path函数

path(route,view,name,kwargs=None)
route : url匹配规则
view : 视图函数或者是类视图as_view()或者是django.urls.include()函数的返回值
name : 命名

DIRS 模板查找路径配置

在settings.py下TEMPLATES配置路径

  1. “DIRS” 视图使用render渲染模板都是从这个出发的
  2. "APP_DIRS"是否在app下的templates下查找模板,如果需要确保INSTALLED_APPS安装了app

DTL 模板语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# profile.html代码模块
<p> {{ username }}</p>

# 循环遍历
{% for key in d.key %}
内容体

{% empty %} <--d.key为空执行
内容

{% endfor %}

# views.py代码
def profile(request):
return render(request,'profile.html',context={'username':'name'})

过滤器语法

推荐下面这个博客
https://blog.csdn.net/a599174211/article/details/82751693

数据库检查连接

  1. 命令行输入:mysql --version
  2. 输入:mysql -uroot -p,填写密码,进入mysql。
  3. 输入: show databases;查看已有数据库。
    一个简单的例子:
1
2
3
4
5
cursor = connection.cursor()
cursor.execute("se;ect * from book")
rows = cursor.fetchall()
for i in rows:
print(i)

ORM模型

  1. 易用性:使用ORM做数据库开发可以减少重复SQL语句的概率
  2. 性能损耗小
  3. 设计灵活
  4. 可移植性

将 OMR 模型映射到数据库中,分为以下几步:

  1. 在settings.py中配置好DATABASES
  2. 在app中的models.py中定义好模型,这个模型必须是django.db.models
  3. 将这个app添加到settings.py的INSTALLED_APPS
  4. 在命令行终端执行python manage.py makemigrations来生成迁移脚本
  5. 执行python manage.py migrate来将迁移脚本映射到数据库中

举一个例子:
建立模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class BookModel(models.Model):
name = models.CharField(max_length=100)
author = models.CharField(max_length=100)
pub_time = models.DateTimeField(auto_now_add=True)
price = models.FloatField(default=0)
# id是默认存在的,django会自动添加

#路由配置
urlpatterns = [
path("admin/", admin.site.urls),
path("",views.index,name="index"),
path('book/add',views.add_book,name="add_book"),
path('book/sel',views.select_book,name="select_book"),
path('book/que',views.query_book,name="query_book")
]

执行上面讲的,下面是相关操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def index(request):
cursor = connection.cursor()
cursor.execute("select * from book")
rows = cursor.fetchall()
for i in rows:
print(i)
return HttpResponse("ok")

def add_book(request):
book = BookModel(name='三国演义',author='不知道',price=100)
book.save()
return HttpResponse("导入成功")

def select_book(request):
books = BookModel.objects.all()
for book in books:
print(book.id,book.name,book.author,book.pub_time)
return HttpResponse('查找成功')

def query_book(request):
books = BookModel.objects.filter(name='三国演义') -->返回的是数组,get是单个对象。前者遇到不存在返回空列表,后者抛出异常。
for book in books:
print(book.id, book.name, book.author, book.pub_time)
return HttpResponse('查询成功')

books = BookModel.objects.order_by('pub_date') # 排序
books = BookModel.objects.order_by('-pub_date') # 倒序排序
books.save() # 修改数据别忘记了
books.delete() # 删除数据

django 模型models 常用字段

  1. models.AutoField
  • 自增列 = int(11)
  • 如果没有的话,默认会生成一个名称为 id的列
  • 如果要显式的自定义一个自增列,必须设置primary_key=True
  1. models.CharField 
  • 字符串字段
  • 必须设置max_length参数
  1. models.BooleanField
  • 布尔类型=tinyint(1)
  • 不能为空,可添加Blank=True
  1. models.ComaSeparatedIntegerField
  • 用逗号分割的数字=varchar
  • 继承CharField,所以必须 max_lenght 参数
  1. models.DateField
  • 日期类型 date
  • DateField.auto_now:保存时自动设置该字段为现在日期,最后修改日期
  • DateField.auto_now_add:当该对象第一次被创建是自动设置该字段为现在日期,创建日期。
  1. models.DateTimeField  
  • 日期时间类型 datetime
  • DateField的参数
  1. models.Decimal  
  • 十进制小数类型 = decimal
  • DecimalField.max_digits:数字中允许的最大位数
  • DecimalField.decimal_places:存储的十进制位数
  1. models.EmailField  
  • 一个带有检查 Email 合法性的 CharField
  1. models.FloatField
  • 浮点类型 = double
  1. models.IntegerField  
  • 整形

11、models.BigIntegerField  

  • 长整形
1
2
3
4
5
6
7
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
  1. models.GenericIPAddressField
  • 一个带有检查 IP地址合法性的 CharField
  1. models.NullBooleanField
  • 允许为空的布尔类型
  1. models.PositiveIntegerFiel
  • 正整数
  1. models.PositiveSmallIntegerField 
  • smallInteger
  1. models.SlugField  
  • 减号、下划线、字母、数字
  1. models.SmallIntegerField  
  • 数字
  • 数据库中的字段有:tinyint、smallint、int、bigint
  1. models.TextField 
  • 大文本。默认对应的form标签是textarea
  1. models.TimeField
  • 时间 HH:MM[:ss[.uuuuuu]]
  1. models.URLField  
  • 一个带有URL合法性校验的CharField
  1. models.BinaryField 
  • 二进制
  • 存储二进制数据。不能使用filter函数获得QuerySet
  1. models.ImageField
  • 图片
  • ImageField.height_field、ImageField.width_field:如果提供这两个参数,则图片将按提供的高度和宽度规格保存。
  • 该字段要求 Python ImagingPillow
  • 会检查上传的对象是否是一个合法图片。
  1. models.FileField(upload_to=None[, max_length=100, ** options])
  • 文件
  • FileField.upload_to:一个用于保存上传文件的本地文件系统路径,该路径由MEDIA_ROOT中设置
  • 这个字段不能设置primary_keyunique选项.在数据库中存储类型是varchar,默认最大长度为100
  1. models.FilePathField(path=None[, math=None, recursive=False, max_length=100, **options])
  • FilePathField.path:文件的绝对路径,必填
  • FilePathField.match:用于过滤路径下文件名的正则表达式,该表达式将用在文件名上(不包括路径)。
  • FilePathField.recursiveTrueFalse,默认为 False,指定是否应包括所有子目录的路径。
  • 例如:FilePathField(path="/home/images", match="foo.*", recursive=True)
  • 将匹配“/home/images/foo.gif”但不匹配“/home/images/foo/bar.gif”
  1. UUIDFIELD
  • uuid是32位唯一的字符串,一般用来作为主键