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.hqwc.cn/news/453528.html

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

相关文章

代码随想录算法训练营第18天 | 513.找树左下角的值, 112. 路径总和,113. 路径总和 ||,106.从中序与后序遍历序列构造二叉树

二叉树理论基础&#xff1a; https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE 513.找树左下角的值 题目链接&#xff1a;https://leetcode.cn/problems/find-bottom-left…

【算法与数据结构】647、516、LeetCode回文子串+最长回文子序列

文章目录 一、647、回文子串二、516、最长回文子序列三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、647、回文子串 思路分析&#xff1a;判断一个字符串是否为回文串那么必须确定回文串的所在区间&#xff0c;而一维…

Quartus IP 之mif与hex文件创建与使用

一、mif与hex概述 ROM IP的数据需要满足断电不丢失的要求&#xff0c;ROM IP数据的文件格式一般有三种文件格式&#xff1a;.mif、.hex、.coe&#xff0c;Xilinx与Intel Altera支持的ROM IP数据文件格式如下&#xff1a; Xilinx与Altera支持的ROM文件格式 Alterahex、mifAM&am…

Java实现婚恋交友网站 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新闻管理模块2.4 相亲大会管理模块2.5 留言管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 会员信息表3.2.2 新闻表3.2.3 相亲大会表3.2.4 留言表 四、系统展示五、核心代码5.…

2.4日总结

第一题&#xff1a;选数 题解&#xff1a;思路还是很简单的&#xff0c;只需要想清楚dfs里的函数都是什么就可以了&#xff0c;还有一个简单的判断素数的函数&#xff0c;这题真没啥难度&#xff0c;就是属于基础题吧&#xff0c;请看AC代码 #include <stdio.h> #includ…

「Kafka」消费者篇

「Kafka」消费者篇 Kafka 消费方式 Kafka 消费者工作流程 消费者总体工作流程 新版本&#xff08;0.9之后&#xff09;的 offset 保存在 kafka 的 Topic 里&#xff0c;持久化到磁盘&#xff0c;可靠性有保障。 老版本&#xff08;0.9之前&#xff09;的 offset 保存在 Zook…

前端学习第4天

一、复合选择器 1.后代选择器 2.子代选择器 3.并集选择器 4.交集选择器 5.伪类选择器 1.伪类-超链接&#xff08;拓展&#xff09; 二、CSS特性 1.继承性 body放在style中 2.层叠性 3.优先级 属性 !important;&#xff08;最高优先级&#xff09; 1.优先级-叠加计算规则 2.em…

源码梳理(3)MybatisPlus启动流程

文章目录 1&#xff0c;MybatisPlus的使用示例2&#xff0c;BaseMapper方法的执行2,1 MybatisMapperProxy代理对象2.2 InvocationHandler接口&#xff08;JDK动态代理&#xff09;2.3 MapperMethodInvoker接口2.4 MybatisMapperMethod 3&#xff0c;SqlSession的执行流程3.1 Sq…

Java SPI 代码示例

Java Service Provider Interface 是JDK自带的服务提供者接口又叫服务发现机制更是一种面向接口的设计思想。即JDK本身提供接口类&#xff0c; 第三方实现其接口&#xff0c;并作为jar包或其他方式注入到其中&#xff0c; 在运行时会被JDK ServiceLoader 发现并加载&#xff0c…

力扣热门100题刷题笔记 - 10. 正则表达式匹配

力扣热门100题 - 10. 正则表达式匹配 题目链接&#xff1a;10. 正则表达式匹配 题目描述&#xff1a; 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配&#xff…

3.0 Hadoop 概念

本章着重介绍 Hadoop 中的概念和组成部分&#xff0c;属于理论章节。如果你比较着急可以跳过。但作者不建议跳过&#xff0c;因为它与后面的章节息息相关。 Hadoop 整体设计 Hadoop 框架是用于计算机集群大数据处理的框架&#xff0c;所以它必须是一个可以部署在多台计算机上…

Linux内存管理:(十二)Linux 5.0内核新增的反碎片优化

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 外碎片化发生时&#xff0c;页面分配…