Hello World - Django5
type: channel
link: https://blog.moshanghua.net/index.php/tag/Django5/
items: Django CRUD操作
items: Django 模型
items: Django DTL 模板
items: Django 基础

Django CRUD操作
type: item
date: 2024-08-01T02:34:16+00:00
description: 在 ORM 框架中，所有模型相关的操作，比如添加/删除等，其实都是映射到数据库中一条数据的操作，因此模型操作也就是数据库表中数据的操作。首先需要创建一个模型。添加模型到数据库中。from django.db import models # Create your models here. class User(models.Model): username = models.CharField(max_length=20) password = models.CharField(max_length=100) # 表一对一,用户表和用户信息表, 常用和不常用 class UserExtension(models.Model): birthday = models.DateTimeField() university = models.CharField(max_length=200) user = models.OneToOneField("User", on_delete=models.CASCADE) class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() pub_time = models.DateTimeField(auto_now_add=True, null=True) author = models.ForeignKey( "User", on_delete=models.SET_DEFAULT, default=1, related_name="articles" ) tags = models.ManyToManyField("Tag", related_name="articles") class Tag(models.Model): name = models.CharField(max_length=100) class Comment(models.Model): content = models.TextField() origin_comment = models.ForeignKey("self", on_delete=models.CASCADE, null=True)添加一个模型实例到数据库中添加模型到数据库中，首先需要创建一个模型，创建模型的方式很简单，就跟创建普通的 Python 对象是一摸一样的。在创建完模型之后，需要调用模型的 save 方法，这样 Django 会自动的将这个模型转换成sql 语句，然后存储到数据库中。from django.shortcuts import HttpResponse def add_user(request): user = User(username="xiaoming", password="111111") # 调用save()方法：是将模型对象的数据保存到数据库表中，即在数据库表中插入一条新的记录。 user.save() return HttpResponse(f"用户 {user.username} 添加成功!")执行访问以上视图函数 add_user 就会往User这个表里面添加一条数据二次添加或者更新数据，比如创建用户时没创建UserExtension 表里的数据from django.shortcuts import HttpResponse from django.utils import timezone from .models import User, UserExtension def add_user_extension(request): # 获取已经存在的用户 try: user = User.objects.get(username="xiaoming") except User.DoesNotExist: return HttpResponse("用户 xiaoming 不存在。") # 准备要添加的扩展信息数据 birthday = "2024-08-01" university = "Example University" # 创建或更新 UserExtension 数据 user_extension, created = UserExtension.objects.get_or_create( user=user, defaults={'birthday': birthday, 'university': university} ) if not created: # UserExtension 已经存在，更新数据 user_extension.birthday =…

Django 模型
type: item
date: 2024-07-31T12:37:09+00:00
description: Django数据库MySQL驱动程序安装使用 Django 来操作 MySQL ，实际上底层还是通过 Python 来操作的。因此想要用 Django 来操作 MySQL ，首先还是需要安装一个驱动程序。在 Python3 中，驱动程序有多种选择。比如有 pymysql 以及 mysqlclient 等。这里我们就使用 mysqlclient 来操作。mysqlclient 安装非常简单pip install mysqlclient配置连接数据库在操作数据库之前，首先要连接数据库，这里以配置 MySQL 为例。Django 连接数据库，不需要单独的创建一个连接对象。只需要在 settings.py 文件中找到DATABASES字段做好数据库相关的配置就可以了。DATABASES = { "default": { # 数据库引擎（是mysql还是oracle等） "ENGINE": "django.db.backends.mysql", # 数据库的名字 "NAME": "database_django", # 连接mysql数据库的用户名 "USER": "root", # 连接mysql数据库的密码 "PASSWORD": "root", # mysql数据库的主机地址 "HOST": "127.0.0.1", # mysql数据库的端口号 "PORT": "3306", } }其中 engine 的选择还有以下：'django.db.backends.postgresql''django.db.backends.mysql''django.db.backends.sqlite3''django.db.backends.oracle'在Django中操作数据库在 Django 中操作数据库有两种方式。第一种方式就是使用原生 sql 语句操作，第二种就是使用 ORM 模型来操作。本笔记记录使用ORM 模型来操作，这里稍微记录一下原生 sql 语句操作在 Django 中使用原生 sql 语句操作其实就是使用 python db api 的接口来操作。如果你的 mysql 驱动使用的是 pymysql ，那么你就是使用 pymysql 来操作的，只不过 Django 将数据库连接的这一部分封装好了，我们只要在 settings.py 中配置好了数据库连接信息后直接使用 Django 封装好的接口就可以操作了。# 使用django封装好的connection对象，会自动读取settings.py中数据库的配置信息 from django.db import connection # 获取游标对象 cursor = connection.cursor() # 拿到游标对象后执行sql语句 cursor.execute("select * from book") # 获取所有的数据 rows = cursor.fetchall() # 遍历查询到的数据 for row in rows: print(row)以上的 execute 以及 fetchall 方法都是 Python DB API 规范中定义好的。ORM模型介绍ORM ，全称 Object Relational Mapping ，中文叫做对象关系映射，通过 ORM 我们可以通过类的方式去操作数据库，而不用再写原生的SQL语句。通过把表映射成类，把行作实例，把字段作为属性， ORM 在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。创建ORM模型ORM 模型一般都是放在 app 的 models.py 文件中。每个 app 都可以拥有自己的模型。并且如果这个模型想要映射到数据库中，那么这个 app 必须要放在 settings.py 的 INSTALLED_APP 中进行安装。以下是写一个简单的书籍 ORM 模型。# 从Django的 django.db 模块中导入了 models 模块 # models 模块包含了用于定义各种数据库字段类型和模型的类 from django.db import models # 定义了一个名为 Book 的类，并继承自 models.Model # 继承 models.Model 表示这个类是一个Django模型，将映射到数据库中的一个表 class Book(models.Model): # 包含四个字段：name、author、pub_time 和 price name = models.CharField(max_length=20,null=False) author = models.CharField(max_length=20,null=False) pub_time = models.DateTimeField(…

Django DTL 模板
type: item
date: 2024-07-27T12:32:22+00:00
description: 目前市面上有非常多的模板系统，其中最知名最好用的就是DTL和Jinja2。 DTL 是 Django Template Language 三个单词的缩写，也就是Django自带的模板语言。当然也可以配置Django支持Jinja2等其他模板引擎，但是作为Django内置的模板语言，和Django可以达到无缝衔接而不会产生一些不兼容的情况。DTL与普通的HTML文件的区别DTL模板是一种带有特殊语法的HTML文件，这个HTML文件可以被Django编译，可以传递参数进去，实现数据动态化。在编译完成后，生成一个普通的HTML文件，然后发送给客户端。渲染模板渲染模板有多种方式。列举两种常用的方式。render_to_string ：找到模板，然后将模板编译后渲染成Python的字符串格式。最后再通过HttpResponse 类包装成一个 HttpResponse 对象返回回去。示例代码如下：from django.template.loader import render_to_string from django.http import HttpResponse def book_detail(request,book_id): html = render_to_string("detail.html") return HttpResponse(html)django还提供了一个更加简便的方式，直接将模板渲染成字符串和包装成 HttpResponse 对象一步到位完成。示例代码如下：from django.shortcuts import render def book_list(request): return render(request,'list.html')模板查找路径配置：在项目的 settings.py 文件中。有一个 TEMPLATES 配置，这个配置包含了模板引擎的配置，模板查找路径的配置，模板上下文的配置等。模板路径可以在两个地方配置。DIRS ：这是一个列表，在这个列表中可以存放所有的模板路径，以后在视图中使用 render 或者render_to_string 渲染模板的时候，会在这个列表的路径中查找模板。APP_DIRS ：默认为 True ，这个设置为 True 后，会在 INSTALLED_APPS 的安装了的 APP 下的templates 文件夹中查找模板。TEMPLATES = [ { .... # 定义存放模板的目录，这里使用 templates 目录 "DIRS": [BASE_DIR / "templates"], "APP_DIRS": True, "OPTIONS": { ... }, ] 查找顺序：比如代码 render('list.html') 。先会在 DIRS 这个列表中依次查找路径下有没有这个模板，如果有，就返回。如果 DIRS 列表中所有的路径都没有找到，那么会先检查当前这个视图所处的 app 是否已经安装，如果已经安装了，那么就先在当前这个 app 下的 templates 文件夹中查找模板，如果没有找到，那么会在其他已经安装了的 app 中查找。如果所有路径下都没有找到，那么会抛出一个 TemplateDoesNotExist 的异常。DTL模板语法变量：模板中可以包含变量， Django 在渲染模板的时候，可以传递变量对应的值过去进行替换。变量的命名规范和 Python 非常类似，只能是阿拉伯数字和英文字符以及下划线的组合，不能出现标点符号等特殊字符。变量需要通过视图函数渲染，视图函数在使用 render 或者 render_to_string 的时候可以传递一个context 的参数，这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的。示例代码如下：# views.py代码 def profile(request): return render(request,'profile.html',context={'username':'陌上花'}) # profile.html模板代码 {{ username }} 除了变量，还可以是字典，列表以及对象。模板中的变量同样也支持 点(.) 的形式。# views.py代码 def info(request): # 1. 普通的变量 username = "悦来小陌" # 2. 字典类型 book = {"firm": "悦来集团", "name": "henry"} # 3. 列表 books = [ {"name": "全职高手", "author": "蝴蝶蓝"}, {"name": "斗破苍穹", "author": "天蚕土豆"}, ] # 4. 对象 class Person: def __init…

Django 基础
type: item
date: 2024-07-27T09:08:47+00:00
description: Django5 入门Django相关的网址Github源代码：https://github.com/django/djangoDjango官网：https://www.djangoproject.com/安装Django通过 pip install django 安装 django ，本文以 Django 5.0.3 版本进行记录。pip install django #如需要指定版本用这个命令 pip install django==5.0.3 初始化 Django 项目创建项目使用命令： django-admin startproject [项目名称] 即可创建。初始化一个新的 Django 项目，例如：django-admin startproject startdjango 创建应用（app）：一个项目类似于是一个架子，但是真正起作用的还是 app 。在终端进入到项目所在的路径，然后执行 python manage.py startapp [app名称] 创建一个app。运行Django项目进入项目，通过命令行的方式： python manage.py runserver这样可以在本地访问项目网站，默认端口号是 8000 ，在浏览器中通过 http://127.0.0.1:8000/ 来访问cd startdjango python manage.py runserver如果想要修改端口号，那么在运行的时候可以指定端口号，python manage.py runserver 9000这样就可以通过9000端口来访问python manage.py runserver 9000项目结构介绍 manage.py：以后和项目交互基本上都是基于这个文件。一般都是在终端输入python manage.py [子命令]。可以输入python manage.py help看下能做什么事情。除非你知道你自己在做什么，一般情况下不应该编辑这个文件。 settings.py：本项目的设置项，以后所有和项目相关的配置都是放在这个里面。 urls.py：这个文件是用来配置URL路由的。比如访问http://127.0.0.1/news/是访问新闻列表页，这些东西就需要在这个文件中完成。 wsgi.py：项目与WSGI工协议兼容的web服务器入口，部署的时候需要用到的，一般情况下也是不需要修改的。 project和app的关系app是django项目的组成部分。一个app代表项目中的一个模块，所有URL请求的响应都是由app来处理。比如豆瓣，里面有图书，电影，音乐，同城等许许多多的模块，如果站在django的角度来看，图书，电影这些模块就是app，图书，电影这些app共同组成豆瓣这个项目。因此这里要有一个概念，django项目由许多 app组成，一个app可以被用到其他项目，django也能拥有不同的app。通过命令：python manage.py startapp bookURL分发器一、视图：视图一般都写在 app 的 views.py 中。并且视图的第一个参数永远都是 request （一个HttpRequest）对象。这个对象存储了请求过来的所有信息，包括携带的参数以及一些头部信息等。在视图中，一般是完成逻辑相关的操作。def book_list(request): return HttpResponse("书籍列表！")视图可以是函数，也可以是类。二、URL映射：视图写完后，要与URL进行映射，即用户在浏览器中输入什么 url 的时候可以请求到这个视图函数。在用户输入了某个 url ，请求到我们的网站的时候， django 会从项目的 urls.py 文件中寻找对应的视图。在 urls.py 文件中有一个 urlpatterns 变量，以后 django 就会从这个变量中读取所有的匹配规则。匹配规则需要使用 django.urls.path 函数进行包裹，这个函数会根据传入的参数返回URLPattern 或者是 URLResolver 的对象。示例代码如下：from django.contrib import admin from django.urls import path from book import views urlpatterns = [ path('admin/', admin.site.urls), path('book/',views.book_list) ]URL中添加参数：有时候， url 中包含了一些参数需要动态调整。比如博客某篇文章的详情页的url，是https://moshanghua.net/details/3276 后面的 3276 就是这篇文章的 id ，那么文章详情页面的url就可以写成 ht…