Django 基础
创始人
2024-11-16 17:35:07
0

Django是一个流行的高级Python Web框架,它旨在简化快速开发动态网站和Web应用的过程。Django的核心理念是“约定优于配置”,这意味着它提供了一系列强大的内置功能,如ORM(Object-Relational Mapping),自动管理后台系统、表单处理、URL路由等。

Django的主要特性包括:

  • MVC设计模式:模型(Model)、视图(View)和模板(Template)三者的分层结构,使得开发人员可以专注于各自的职责。
  • ORM:通过数据库操作模型对象而非SQL语句,提高开发效率并降低出错可能性。
  • DRF(Django Rest Framework):用于构建RESTful API的模块,简化API的设计和开发。
  • Admin站点:内置的用户界面管理系统,方便快速添加、编辑和查看内容。
  • URL路由:简单易用的URL配置,支持正则表达式匹配和命名路径。
  • 模板语言:基于HTML的简单易学的模板语法,支持条件语句、循环等。

1.Django模版语言

Django HTML模板语言是一种轻量级、高度模板化的系统,它允许开发者在HTML文件中嵌入Python表达式,结合Django框架动态生成内容。以下是Django模板语言的一些关键特性:

  1. 变量绑定:使用`{{ variable_name }}`语法显示模型数据,Django会自动处理变量的安全性和数据类型转换。
  2. 条件语句:`{% if condition %}`用于控制结构,如果条件成立则展示内容;还有`{% else %}`和`{% elif %}`用于多条件判断。
  3. 循环遍历:`for item in list:`可以迭代一个列表或其他序列,并用`item`替换为每次迭代的值,如`{{ forloop.counter }}`用于访问当前迭代次数等。
  4. 标签(Filters):`| filter_name`用于对变量应用内置过滤器,例如日期格式化、字符串截取等。
  5. 模板继承:通过`extends`关键字定义基础模板,子模板可以在其中覆盖或添加内容,减少重复代码。
  6. 模板片段(Template Tags):自定义功能强大的标签,类似于HTML的自定义元素,提供更高级的功能。
  7. 模板命名空间:`{% load namespace %}`可以组织相关的模板组件,保持代码整洁。
# =====HTML文件声明使用模版语音  {% load static %}  # =====变量:在模板中使用 {{ variable }} 来表示变量,例如:  

{{ my_variable }}

# =====标签:使用 {% tag %} 来执行逻辑,例如循环: {% for item in items %}

{{ item }}

{% endfor %} # =====过滤器:使用 | 管道符应用过滤器来改变变量的显示,例如:

{{ my_variable|upper }}

# =====模板继承:使用 {% extends %} 和 {% block %} 标签实现模板继承: {% extends "base.html" %} {% block content %}

This is the content of the page.

{% endblock %} # =====静态文件:使用 {% static %} 标签来引入静态文件:

2.URL传值

# urls.py路由定义 from django.contrib import admin from django.urls import path from app01 views as app01views # URL 正则化输入 from django.urls import re_path  from app02 import views as app02views # 调用其他app下定义的 url from django.urls import include  urlpatterns = [     path('admin/', admin.site.urls),     path('',app01views.index),     # 定义只能接收int型输入     path('num//',app01views.index_num),     path('num/detail/',app01views.index_detail),     # 正则化规范URL 0-9 6位输入 (?P[0-9]{6})     # 95开头的六位数字 (?P[9][5]\d{4})     re_path('renum/(?P[0-9]{6})/(?P[0-4])',app01views.re_path),      path('index/',app02views.index),     path('rander_index/',app02views.rander_index),     path('read_csv/',app02views.handle_csv),     # 中转处理url 为空时访问路径直接是 home/urls 定义的路径,不为空则访问的是拼接起来的路径/home/home     path('home/',include('home.urls')),     path('mysql/',include('mysqlconnect.urls')) ] 
# views.py 定义 from django.shortcuts import render from django.http import HttpResponse  # Create your views here.  def index(request):     return HttpResponse("首页")   # URL 传值 def index_num(request,num_id):     return HttpResponse('接受的ID为:%s URL输入'% num_id)  # URL 查询字符串传值 def index_detail(request):     # http://192.168.20.110/num/detail/?num=12346     # 对标 ?和 = 之间的字符串     num_id = request.GET.get('num')     # 传递多个值 用 & 隔开     # http://192.168.20.110/num/detail/?num=12346&city=shanghai     city = request.GET.get('city')     return HttpResponse('接受的ID为:%s URL输入,坐标:%s' % (num_id,city))  # 正则化规范URL def re_path(request,num_id,type):     type_num = ['上海','北京','广州','深圳']     return HttpResponse('接受的正则化ID为:%s URL输入 \n 城市:%s' % (num_id,type_num[int(type)]))

 3.ORM常用字段及参数

python manage.py migrate --fake(对已存在的表进行数据同步)   ********************查询操作的返回值********************** all()--- 所有 filter() --- 满足条件的所有 exclude()---排除对象 order_by()--- 排序 reverse()-- 反序 distinct()-- 去重 values(): 返回一个可迭代的字典序列 values list():返回一个可迭代的元祖序列 get()满足条件的第一个对象 first()整个集合的第一个对象 last()整个集合的最后一个对象 exists()  --- 是否存在满足条件的对象 false/true Count()--- 返回结果集的数量   results = models.student.objects.all()#返回所有对象 results = models.student.objects.filter(gender='男')# 返回所有满足条件的对象 results = models.Student.objects.exclude(sname='Bob')#排除Bob results = models.student.objects.all().order_by('-sage')# 排序 results = models.student.objects.all().order by('-sage').reverse()#反序 results = models.Student.objects.get(sname='Alice') results = models.student.objects.first() results = models.student.objects.last() result = models.student.objects.filter(sname='张=').exists() result = models.Student.objects.filter(gender='男').count() results = models.Borrowbook.objects.all().values("sno_id").distinct() #去除指定列重复值  ********************查询基本条件**********************  1.获取所有数据 results = models.Student.objects.all().values() 2.判断相等 results = models.Student.objects.filter(gender='男’)results = models.Student.objects.filter(gender exact='男’)results = models.Student.objects.filter(sage exact=None) 3.大于小于年龄大于等于25岁 results = models.Student.objects.filter(sage gte=25)# 年龄小于等于25岁 results = models.Student.objects.filter(sage ite=25) 4.in--- 在某一个list范围内 # 查询出姓名登录Alice,bob results = models.Student.objects.filter(sname in =['Alice','Bob']) 5.range--某一个范围 ,相当于SQL中的Between --- and --- results = models.Student.objects.filter(sage range =(25,30)) 5.判断是空 --isnull results = models.Student.objects.filter(sage isnull=True)  ==============练习================= 查询出姓名为“陈鹏”的学号、手机号码和邮箱地址 results = models.Student.objects.filter(sname='陈鹏') results=models.Student.objects.filter(sage exact='陈') results = models.Student.objects.filter(sage in=['陈鹏']) 查询出姓名不是“陈鹏”的学生的所有信息 results=models.Student.objects.exclude(sname exact='陈鹏') 查询出大于25的女生的学生信息 results = models.Student.objects.filter(sage gte=25, gender exact='女') 查询出学生年龄介于20到30间的学生学号和姓名 results = models.Student.objects.filter(sage range=(20,30)) 查询哪些学生没有填写“年龄”信息 results = models.Student.objects.filter(sage exact=None) results = models.Student.objects.filter(sage isnull=True) 查询出“陈鹏”,”Alice”,”Bob”的学号,年龄 results = models.Student.objects.filter(sname in=['Alice','Bob','陈鹏”])  ********************ORM模糊查询********************** 1.模糊查询 ---startswith,endswith,contains 查询出以134开头的手机号码 students = models.Student.objects.filter(stumobile startswith='134').values() 查询出以8开头的手机号码 students = models.Student.objects.filter(stumobile endswith='5').values() 查询手机号码中包含88 students = models.Student.objects.filter(stumobile contains='88').values()  ==============练习================= 查询出所有姓“陈”的学生 students = models.Student.objects.filter(sname startswith='陈’).values() 查询出手机号码134或者135开头,倒数第四位为不是7也不是8的学生姓名 students = models.Student.objects.filter(stumobile regex=r'^[1][3][45][0-9]{4}[^78][0-9]{3}$' ).values 查询出借过书的同学的学号 results = models.Borrowbook.objects.all().values("sno__id").distinct() 对Student表按照年龄升序排序,如果年龄一样,女生排在男生前面 results = models.Student.objects.all().order by('sage','gender').values() 查询出Student表中的前5行记录 results = models.Student.objects.all()[0:5].values()    ********************ORM聚合函数********************** COUNT:求所选记录行数 AVG:求所选记录的平均值 SUM:为所选记录求和 MAX:求所选记录的最大值 MIN:求所选记录的最小值  导入模块:from django.db.models import Count, Max, Min, Sum, Avg 方法:Book.objects.aggregate()  ==============练习================= 1.统计出学生最大年龄,最小年龄 results = models.Student.objects.aggregate(max age = Max('sage’), min_age = Min('sage') 2.查询出男生的平均年龄 results = models.Student.objects.filter(gender exact='男’).aggregate(avg=Avg('sage”)) 3.查询出有多少位学生借书 results = models.Borrowbook.objects.aggregate(number = Count('sno',distinct=True)) 4.查询出计算机类的图书总共有多少本 results = models.Book.objectsfiter(booktype_exact=1).aggregate(sum_num = Sum('booksumno’)   ********************ORM分组查询********************** 方法:Book.objects.annotate()  ==============练习================= 统计出男女生的人数 results = models.Student.objects.values('gender'").annotate(number=Count('gender') # 统计出每一类书中的最高的价格results = models.Book.objects.values('booktype').annotate(maxprice=Max('bookprice’) 统计出每一类书中的最高的价格大于等于45元 results = models.Book.objects.values('booktype’).annotate(maxprice=Max('bookprice').filter(maxprice gte=45.0) 查询出借的超过两本的书的ID号及数量 results = models.Borrowbook.objects.values('bookid').annotate(number=Count('id').filter(number gt=2) 统计出借书多于两本的学生学号以及数量,按照数量的降序排列 results = models,Borrowbook.objects.values('sno’.annotate(number=Count!'id").filter(number gt=2).order by-number')   ********************ORM F表达式 对两个字段的值做比较********************** 统计出男女生的人数 results = models.Borrowbook.objects.filter(borrowdate gt = F('returndate')).values() bookprice价格都加1 models.Book.objects.update(bookprice = F('bookprice')+ 1.0)  导入:from django.db.models import F,Q  ********************ORM Q表达式********************** filter() 等方法中的关键字参数查询都是一起进行“AND” ,如果希望两个条件是“OR”的关系,需要用到Q 表达式 统计出男生等于25岁人数 results = models.student.objects.filter(k(gender_exact='男')| Q(sage_gte=25))   ********************ORM 连接查询**********************  由一查多:给定的条件在主键表中,要査询的内容在外键表中 ---正向查询  记住字段名 #比如查询:李明志写了哪些书? 多类名.objects.filter(关联属性__类属性名=县体条件) results = models.Book.objects.filter(bookauthor__authorname_exact='李明志').values()  由多查一:给定的条件在外键表中,要査询的内容在主键表中 ---反向查询  记住表名 一类名.objects.filter(多类名小写__多类属性名=具体条件) results = models.Press.objects.filter(book__bookid_exact=95006)   ==============练习================= 查询出陈鹏所借的图书id 关系:1对多 有一查多 Student:BorrowBookresults = models.Borrowbook.objects.filter(sno_sname_exact='陈鹏').values() 95005的书被哪些同学借 由BorrowBook去查Student关系:多查 results = models.student.objects.filter(borrowbook bookid exact=39005).values()  ********************ORM 多表连接查询**********************  查询出陈鹏所借的图书的作者 results = models.Author.objects.filter(book__borrowbook__sno__sname='陈鹏').distinct().values()   

相关内容

热门资讯

一分钟知晓!(算翻宝典)外挂透... 一分钟知晓!(算翻宝典)外挂透视辅助代打!(透视)详细教程(2021已更新)(哔哩哔哩)是一款可以让...
推荐一款!网易棋牌麻将有挂的,... 推荐一款!网易棋牌麻将有挂的,网易棋牌才能赢,原来真实是真的有挂(2025已更新)(哔哩哔哩)推荐一...
终于知道!((WPK app)... 终于知道!((WPK app))外挂透明挂辅助|工具!太坑了原来真的真的是有挂(2024已更新)(哔...
实测揭晓!德扑之星软件模拟器,... 实测揭晓!德扑之星软件模拟器,红龙扑克有挂的,wpk稳定真实真的是有挂(2022已更新)(哔哩哔哩)...
一分钟揭秘!蜀州石城麻将外挂辅... 一分钟揭秘!蜀州石城麻将外挂辅助器神器,wpk俱乐部有ai,wpk德州原来确实真的是有挂(2022已...
实测教程!WPK最新版软件透明... 实测教程!WPK最新版软件透明挂!2021已更新外挂透明挂插件(透视辅助)(哔哩哔哩)是一款可以让一...
6分钟知晓!(28圈)外挂透明... 自定义新版28圈系统规律,只需要输入自己想要的开挂功能,一键便可以生成出28圈专用辅助器,不管你是想...
必知教程!聚乐九州麻将有挂的,... 您好,边锋老友棋牌这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这款...
9分钟了解!aapoker是软... 9分钟了解!aapoker是软件,aapoker有网页版的,微扑克线上原来一直都是有挂(2024已更...
重大通报!((微扑克机器人))... 您好,微扑克机器人这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家在这款...