Django前后端分离之后端实践

django-admin  startproject  djweb  生成djweb项目

django-admin  startapp   news      生成news应用

配置models文件

class NewInfo(models.Model):title = models.CharField(max_length=30)content = models.TextField()b_date=  models.DateField()read = models.IntegerField()

插入数据,进入交互环境: python manage.py shell
 

In [1]: from news.models import NewInfoIn [2]: NewInfo.objects.all()
Out[2]: <QuerySet []># 查询为空,这时插入数据
In [11]: n1= NewInfo()In [12]: n1.title = 'title1'In [13]: n1.read = 999In [14]: n1.b_date= '2024-01-01'In [15]: n1.save()In [20]: res = NewInfo.objects.all()[0]In [21]: res.title  # 保存成功
Out[21]: 'title1'

配置admin文件

from .models import NewInfo
# Register your models here.
admin.site.register(NewInfo)

创建超级用户:python manage.py createsuperuser

用户名 (leave blank to use 'pass'): pass
电子邮件地址: xxx@qq.com
Password:
Password (again):
密码跟 用户名 太相似了。
密码长度太短。密码必须包含至少 8 个字符。
这个密码太常见了。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

启动项目:python manage.py runserver

登录web页面:http://127.0.0.1:8000/admin

点击增加信息:

 展示中文信息及调整时区:

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

点击删除信息:

自定义admin模型类展示数据

class NewInfoAdmin(admin.ModelAdmin):# 自定义模型类list_display = ['id','title','b_date','read']
# 自定义模型定义到系统中
admin.site.register(NewInfo,NewInfoAdmin)

 展示结果:

 总路由分配:

from django.contrib import admin
from django.urls import path,re_path,includeurlpatterns = [path('admin/', admin.site.urls),re_path(r'^news/',include('news.urls'))
]

子路由配置:

from .views import home
urlpatterns = [path('home/',home),
]

debug模式调试代码:

 关闭原有terminal进程,点击debug模式,选择红色按钮断点,此时刷新web页面的访问url地址.

templates模板配置:
# 项目目录位置的模板
# 'DIRS': [],
'DIRS': [BASE_DIR / 'templates'],

msyql数据库配置:

mysql> create database djweb charset = utf8;
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> exit
Bye
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'djweb','USER':'root','PASSWORD':'****','HOST':'localhost','PORT':3306}
}

ORM常用字段类型:

  • AutoField
  • BooleanField
  • CharField
  • TextField
  • DecimalField
  • TimeField
  • DateTimeField
  • FileField

常用字段选项:

  • default
  • primary_key
  • unique
  • db_index  # 索引
  • null
  • blank
  • verbose_name  # web可读
  • help_text

关系字段类型:

ForeignKey :一对多,将字段定义在多的一方中

goods = models.ForeginKey('Goods',on_delete=models.CASCADE)

ManyToManyField: 多对多

users = models.ManToManyField('Users',on_delete=models.CASCADE)

OneToOneField:一对一

goods = models.OneToOneField('Goods',on_delete=models.CASCADE)

自定义关联:使用self指定

goods = models.ForeginKey('self',null=True,blank = True)
goods = models.ManyToManyField('self',null=True,blank = True)

多对对模型类实践案例:

class NewInfo(models.Model):title = models.CharField(max_length=30,verbose_name='标题',help_text="标题")content = models.TextField(max_length=30,verbose_name="内容",help_text='内容')# b_date=  models.DateField()read = models.IntegerField(verbose_name='阅读量',help_text='评论数量')type  = models.ManyToManyField('NewsType',verbose_name='新闻类型',help_text='类型')class NewsType(models.Model):name = models.CharField(max_length=20,verbose_name='名称')

 元选项:

class Meta:# 自定义表名,若无此设置默认为表名:应用名+模型类小写db_table = 'news'verbose_name = '新闻类型'  # 后台可以看到

结果实例:

魔术方法__str__应用

def __str__(self):  #  魔术方法 -- 更改对象显示的内容return self.name

模糊条件查询:

  1. xxx.objects.filter(模型类名__条件名 = 值)
  2. xxx.objects.filter(name__contains='xxx')
  3. xxx.objects.filter(name__startswith='xxx')
  4. xxx.objects.filter(name__endswith='xxx')
  5. xxx.objects.filter(name__in=[1,2,3])

比较条件查询:

  1. xxx.objects.filter(id__gt=1) # 大于
  2. xxx.objects.filter(id__lt=1) # 小于
  3. xxx.objects.filter(id__gte=1) # 大于等于
  4. xxx.objects.filter(id__lte=1) # 小于等于

F对象与Q对象(from django.db.models import F)

  1. F对象用于类属性比较   eg:  xxx.objects.filter(read__gte=F('comment'))
  2. Q对象用于逻辑与或非(&|~)  eg:  xxx.objects.filter(Q(read__gte=40) & Q(comment__gt=30))

聚合函数(from django.db.models import Sum,Avg,Max,Min)

eg:    xxx.objects.all().aggregate(Sum('read'))

  • Sum    
  • Count   
  • Avg
  • Max
  • Min

查询和对象关联的数据

一到多查询:

data = xxx.objects.get(id=1)
data.newinfo_set.all()  #  模型类名小写+_set实现

多到一查询:

data = xxx.object.get(id=1)
data.title  # 通过关联的对象直接获取对应的数据

由一模型类查询多模型类数据

语法: 关联模型类名小写__属性名__条件运算符=值

data=xxx.objects.filter(类名小写__属性名__contains='q') # 查询某一属性包含q的字段

由多模型类查询一模型类数据

语法: 一模型类名小写__一模型类属性名__条件运算符=值

data=xxx.objects.filter(类名小写__属性名='yyy') # 查询属性包含yyy的所有字段

ORM增删改查操作:

  • 修改数据:  查到要修改的对象,直接修改字段xxx.title='yyy',save()方法保存
  • 增加数据:  xxx.属性值=特定值, xxx.save()保存
  • 删除数据:  获取data = xxx.objects.all(),然后xxx.delete()直接删除   

路由参数匹配

  1. 位置参数: 
    re_path(r'^index/(\d+)/$',views.show)  # 直接使用小括号
  2. 关键字参数:
    re_path(r'^index/(?P<name1>\d+)/$',views.show)  

 requests对象的属性

  • path
  • method
  • encoding
  • GET       #   ?'key1'='value1'&'key2'='value2'
  • POST
  • FILES
  • COOKIES
  • session

HttpResponse对象

  • content
  • charset
  • status_code
  • content-type

常用方法

set_cookie(key,value='',max_age=None,expires=None)
# max_age  整数,指定过期时间
# expires  指定日期的特定过期时间
# 上面二选一,若无指定关闭浏览器时cookies会过期eg:  
response = HttpResponse(res_list,status)
response.set_cookie('token','xxx',max_age=4)
response.delete_cookie('token')

session的操作

  1. request.session['key']='value'
  2. request.session.get('key',None)
  3. request.session.clear()  # 清除所有session数据
  4. request.session.flush()  # 清除存储中的整条数据
  5. del  request.session['key']
  6. request.session.set_expiry(value)  # 设置会话的超时时间

类视图的使用步骤:

# views.py
from django.views import View
class NewsView(View):def get(self,request):passdef post(self,request):pass    # urls.pyre.path(r'news/$',views.NewView.as_view())

模板变量

语法:{{ 变量 }}

顺序解析dict.title:

  1. 字典dict['title'] 先属性后方法,若无此属性,再查询对应方法
  2. 若格式dict.0则解析为列表dict[0],若变量不存在则为空字符串

模板标签

语法:{%  xxx  %}

for标签

{% for x in xxx %}
{{forloop.counter} # 表示当前第几次循环,从1开始
{% empty %}  # 列表为空或不存在时执行该逻辑
{% endfor %}

if标签

{% if ... %}
{% elif ... %}
{% else %}
{% endif %}

过滤器

语法:{{ 管道符号 | 过滤器 }}  eg:{{ xxx | lower}}

  • {{ xxx | upper }}
  • {{ xxx | lower }}
  • {{ xxx | add:2 }}
  • {{ datex | date:'y-m-d' }}

注释

语法: {# xxx #}

父模板
 

{% block xxx %}{% endblock xxx %}

子模板
 

{{% extends '父路径path'%}}{% block xxx %}{% endblock xxx %}

中间件

# 初始化
def __init__(self):pass
# 处理请求前
def process_request(self,request):pass
# 处理视图前
def process_view(self,request,func,*args,**kwargs):pass
# 处理视图后
def process_response(self,request,response):pass
# 处理异常
def process_exception(self,request,exception):pass

自带认证方式登录

from django.contrib.auth import authenticateusername = request.POST['name']
password = request.POST['passwd']
user = authenticate(request,username=username,password=password)
if not user:pass

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux查看当前连接的IP

linux下查询当前所有连接的ip_linux查看某个ip的连接-CSDN博客 netstat -ntu | grep tcp | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -nr

Blazor Wasm Gitee 码云登录

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…

C语言中在main函数之后运行的函数

在 Linux 平台上&#xff0c;atexit 函数同样是一个用于注册终止处理函数的库函数&#xff0c;它是 C 标准库 <stdlib.h> 的一部分。atexit 函数允许你注册一个或多个函数&#xff0c;这些函数会在 main 函数执行结束后&#xff0c;或者在调用 exit 函数时&#xff0c;由…

ClickHouse--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. ClickHouse 简介1.1 大数据处理场景1.2 什么是 ClickHouse1.3 OLAP 场景的特征 2. ClickHouse 特性2.1 完备的 DBMS 功能2.2 列式存储行式存储: 在数据写入和修改…

OpenEuler20.03LTS SP2 上安装 OpenGauss3.0.0 单机部署过程(二)

开始安装 OpenGauss 数据库 3.1.7 安装依赖包 (说明:如果可以联网,可以通过网络 yum 安装所需依赖包,既可以跳过本步骤。如果网络无法连通,请把本文档所在目录下的依赖包上传到服务器上,手工安装后,即无需通过网络进行 Yum 安装了): 上传:libaio-0.3.111-5.oe1.x8…

保研机试算法训练个人记录笔记(四)——哈希算法

目录 两数之和 字母异位词分组 最长连续序列 力扣热题100——哈希算法 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答…

wireshark抓包问题及学习

wireshark抓包问题及学习 【场景1】服务A请求服务B经常超过3s&#xff0c;报错i/o timeout&#xff0c;想看下是否网络波动或者负载太高。需要抓包分析。 问题1&#xff1a; 超时时间不定&#xff0c;且请求量过大&#xff0c;一直抓了存文件里抓包文件过大。 解决学习&…

三、搜索与图论

DFS 排列数字 #include<iostream> using namespace std; const int N 10; int a[N], b[N]; int n;void dfs(int u){if(u > n){for(int i 1; i < n; i)cout<<a[i]<<" ";cout<<endl;return;}for(int i 1; i < n; i){if(!b[i]){b[…

LeetCode91. Decode Ways——动态规划

文章目录 一、题目二、题解 一、题目 A message containing letters from A-Z can be encoded into numbers using the following mapping: ‘A’ -> “1” ‘B’ -> “2” … ‘Z’ -> “26” To decode an encoded message, all the digits must be grouped then …

数据结构——5.3 二叉树的遍历和线索二叉树

第五章 树与二叉树 5.3 二叉树的遍历和线索二叉树 概念 1.线索二叉树&#xff1a;为了快速得到遍历序列的前驱和后继 2. 理解 1.线索二叉树是一种物理结构&#xff0c;二叉树一种逻辑结构 2.n个结点的线索二叉树具有2n个链域指针&#xff0c;除了根节点外&#xff0c;每个结…

自己DIY制作耳机壳一般用哪种材料比较好,性价比比较高

在选择耳机壳的材料时&#xff0c;除了考虑材料本身的性能外&#xff0c;还需要考虑成本、加工难度、耐用性、环保性等方面的因素。 从性能方面来看&#xff1a; 制作耳机壳的UV树脂和塑料材质各有其优缺点。UV树脂具有高硬度、耐磨、耐高温、环保等优点&#xff0c;能够提供更…

用爬虫自建行业知识库

一 几年前用 Python 写过一个程序&#xff0c;自动抓取各市文化局网站相关栏目文章&#xff0c;然后把抓到的文章&#xff0c;写成离线网页&#xff0c;发到指定邮箱。 当时针对每个网页写一个爬虫&#xff0c;对每一个网页都进行分析。比如&#xff0c;标题是什么&#xff0…

node.js 使用 elementtree 生成思维导图 Freemind 文件

请参阅: java : pdfbox 读取 PDF文件内书签 请注意&#xff1a;书的目录.txt 编码&#xff1a;UTF-8&#xff0c;推荐用 Notepad 转换编码。 npm install elementtree --save 编写 txt_etree_mm.js 如下 // 读目录.txt文件&#xff0c;使用 elementtree 生成思维导图 Free…

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…

【前沿技术杂谈:多模态文档基础模型】使用多模态文档基础模型彻底改变文档 AI

【前沿技术杂谈&#xff1a;多模态文档基础模型】使用多模态文档基础模型彻底改变文档 AI 从文本到多模态模型&#xff1a;文档 AI 逐渐发展新技能。行业领先的型号Document AI 的下一步&#xff1a;开发通用和统一框架 您是否曾经被包含不同信息&#xff08;如应付账款、日期、…

Web后端开发:事务与AOP

事务管理 在学习数据库时&#xff0c;讲到&#xff1a;事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者是撤销操作请求&#xff0c;要么同时成功&#xff0c;要么同时失败。 事务的操作主要有三…

已解决org.springframework.web.HttpMediaTypeNotAcceptableException异常的正确解决方法,亲测有效!!!

已解决org.springframework.web.HttpMediaTypeNotAcceptableException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 问题分析 报错原因 解决思路 解决方法 总结 问题分析 在Spring MVC应用中处理HTTP请求时&#xff0c;我们有…

C#向数组指定索引位置插入新的元素值:自定义插入方法 vs List<T>.Add(T) 方法

目录 一、使用的方法 1.自定义插入方法 2.使用List.Add(T) 方法 二、实例 1.示例1&#xff1a;List.Add(T) 方法 2.示例&#xff1a;自定义插入方法 一、使用的方法 1.自定义插入方法 首先需要定义一个一维数组&#xff0c;然后修改数组的长度(这里使用Length属性获取…

【OpenHarmony硬件操作】WIFI模块的操作(udp+tcp)

文章目录 前言一、网络的连接1.1 WIFI模块有三大功能1.2 相关接口连接网络等待网络连接成功创建一个热点获取本设备ip地址二、tcp客户端的使用2.1 创建socket2.2 sockaddr_in结构体2.3 connect连接服务器2.4 接收数据2.5 发送数据三、UDP

网关中全局过滤器实现jwt校验

意味着有很多相同接口的实现类&#xff0c;那么必定会有优先级的问题。于是Spring就提供了Ordered这个接口&#xff0c;来处理相同接口实现类的优先级问题。 public class AuthorizeFilter implements Ordered, GlobalFilter {Overridepublic Mono<Void> filter(ServerW…