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()   

相关内容

热门资讯

苹果笔记本cad怎么绘图,苹果... 各位朋友,大家好!小编整理了有关苹果笔记本cad怎么绘图的解答,顺便拓展几个相关知识点,希望能解决你...
笔记本加内存条图解 各位朋友,大家好!小编整理了有关笔记本加内存条图解的解答,顺便拓展几个相关知识点,希望能解决你的问题...
交流学习经验(豆豆斗牌)外挂透... 交流学习经验(豆豆斗牌)外挂透明挂辅助软件(有科技)详备教程(2022已更新)(哔哩哔哩),亲,有的...
游戏笔记本电脑性价比排行 游戏... 大家好!小编今天给大家解答一下有关游戏笔记本电脑性价比高,以及分享几个游戏笔记本电脑性价比排行对应的...
笔记本外接屏幕盖起来有影响吗 ... 接下来,给各位带来的是笔记本外接屏幕盖起来的相关解答,其中也会对笔记本外接屏幕盖起来有影响吗进行详细...
笔记本系统重装后触摸板用不了 ... 大家好!小编今天给大家解答一下有关笔记本系统重装,以及分享几个笔记本系统重装后触摸板用不了对应的知识...
笔记本电脑加装蓝牙模块 好久不见,今天给各位带来的是笔记本加装内置蓝牙,文章中也会对笔记本电脑加装蓝牙模块进行解释,如果能碰...
server.exe报错 server.exe报错可能是由于多种原因引起的,它可能是由于系统文件损坏、病毒感染、硬件故障等原因...
笔记本玩联盟太卡 笔记本玩联盟... 各位朋友,大家好!小编整理了有关笔记本玩联盟卡顿的解答,顺便拓展几个相关知识点,希望能解决你的问题,...
bossmonster笔记本(... 朋友们,你们知道bossmonster笔记本这个问题吗?如果不了解该问题的话,小编将详细为你解答,希...