Python Django开发 经验技巧总结(一)

1.前后台的数据传递

view -> HTML:使用Django模版 views.py代码:

1from django.shortcuts import render 2def main_page(request): 3 data = [1,2,3,4] 4 return render(request, 'index.html', {'data': data})

HTML中用 {{}} 获取数据

1<div>{{ data }}</div>

可以对可迭代的数据进行迭代:

1{% for item in data%} 2<p>{{ item }}</p> 3{% endfor %}

该方法可以传递各种数据类型,包括list,dict等等。

2.与数据库交互并返回数据的几种比较常用的方法

1models.UserInfo.objects.all() 2models.UserInfo.objects.all().values('user') #只取user列 3models.UserInfo.objects.all().values_list('id','user') #取出id和user列,并生成一个列表 4models.UserInfo.objects.get(id=1) 5models.UserInfo.objects.get(user='cucucu')

3.一个表单对应多个按钮解决方案

为不同按钮添加不同name属性,然后再后台判断name值

1<form method="post" action="自定" οnsubmit="return"> 2<button type="submit" class="btn btn-info" name="del">删除</button> 3<button type="submit" class="btn btn-info" name="update">更新</button> 4</form>

然后通过不同的name实现不同功能

1def function(request): 2 if request.POST: 3 if 'update' in request.POST: 4 ... #update功能实现 5 else: 6 ... #del功能实现 7 return render(request, 'xxx.html', yyy)

4.HTML中的表单控件及操作

在HTML中表单的书写一般为:

1<form method="post" action=""> 2<!-这个method代表方法,方法一般有两个一个是'post',一个是'get',action是提交表单到何处,可填写一个网址。不填则默认到本页面。> 3 4{%csrf_token%} 5<!-这个是django中的一个标签,用于防止恶意攻击使用,如果不加入这个标签,会遇到不能提交的问题,处理麻烦一点,建议加上。> 6 7<input name="select" type="radio" value='radio'> 8<!-这就是一个单选标签,多选为type='checkbox'。 value是显示的内容,并且后端提交后也将此作为值,其中name是后端获取时所用的如后端使用 select = request.POST['select']获取这个单选按钮的value,另外也可以用select = request.POST.get('select',None)来获取。> 9 10<input name="submit" type="submit" value="提交" /> 11<!-这就是一个提控件,其中的type='submit'会保证点击后表单(<form></form>)中的内容被提交到后端。> 12 13<input name="text" type="text" value="" /> 14<!-一个输入框> 15 16</form> 17 18<!-表单结束>

前端HTML代码:

1<!DOCTYPE html> 2 3<html lang="en"> 4 5<head> 6 7 <meta charset="UTF-8"> 8 9 <title>Title</title> 10 11</head> 12 13<body> 14 15<form method="post" action=""> 16 17{%csrf_token%} 18 19<input name="select" type="radio" value='radio'> 20 21<input name="text" type="text" value="" /> 22 23<input name="submit" type="submit" value="提交" /> 24 25</form> 26 27</body> 28 29</html>

后端在views.py中书写一个函数接受前端传入的数据:

1def receive_data(request): 2if request.POST: # 如果数据提交 3 print('有提交') 4 select = request.POST.get('select',None) 5 text = request.POST.get('text',None) 6 print(select,text) 7return render(request,'your_html.html', locals()) # your_html.html改为你的html页面并且参考前面的博客建立url链接。

5.消息框架 message使用

消息级别:

级别说明
DEBUG将在生产部署中忽略(或删除)的与开发相关的消息
INFO普通提示信息
SUCCESS成功信息
WARNING警告信息
ERROR已经发生的错误信息
该功能运用了django.contrib.messages这个库,在django项目中setting.py文件中APP注册部分自定义注册
1INSTALLED_APPS = [ 2 'django.contrib.admin', 3 'django.contrib.auth', 4 'django.contrib.contenttypes', 5 'django.contrib.sessions', 6 'django.contrib.messages', 7 'django.contrib.staticfiles', 8 'app01.apps.App01Config', # 自定义APP注册 9]

后端views.py中

1from django.contrib import messages 2 3def abc(request): 4 messages.debug(request, '%s SQL statements were executed.' % count) 5 messages.info(request, 'Three credits remain in your account.') 6 messages.success(request, 'Profile details updated.') 7 messages.warning(request, 'Your account expires in three days.') 8 messages.error(request, 'Document deleted.')

或者

1from django.contrib import messages 2 3def abc(request): 4 messages.add_message(request, messages.INFO, 'Hello world.')

前端显示

1{% if messages %} 2 <script> 3 {% for msg in messages %} 4 alert('{{ msg.message }}'); 5 {% endfor %} 6 </script> 7{% endif %} 8

6.日期和时间DateField的auto_now、auto_now_add

创建django的model时,有DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime()、date()、time()三中对象,这三个field有着相同的参数auto_now和auto_now_add。 auto_now: 这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django自带的admin管理器,那么该字段在admin中是只读的。 auto_now_add: 设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。

7.获取已登录用户的名字

在 views里取值是request.user.username,在模板页面取值是{{request.user}},判断是否通过验证是{% if request.user.is_authenticated %}

8.数据库表中属性的自增/自减操作

通过相对更新的操作来更加快速、健壮地实现,而不是显示地(explicit)对新值进行赋值。Django提供了F()表达式 进行相对更新操作

1from django.db.models import F 2product = Product.objects.get(name='Venezuelan Beaver Cheese') 3product.number_sold = F('number_sold') + 1 4product.save()

这种方法没有使用数据库中特定的原始的值,而是当 save() 执行时,让数据库去根据数据库当前的值进行更新操作; 一旦当前对象被存储时,我们必须重新加载当前对象以获取到当前数据库中最新的值。

9.执行原始sql语句

(1)extra()方法: 结果集修改器,一种提供额外查询参数的机制。

1Book.objects.filter(publisher__name='广东人员出版社').extra(where=['price>50']) 2Book.objects.filter(publisher__name='广东人员出版社',price__gt=50) 3Book.objects.extra(select={'count':'select count(*) from hello_Book'})

(2)raw()方法: 管理器的 raw() 方法可以用于执行原始 SQL 并返回模型实例: Manager.raw(raw_query, params=None, translations=None) 使用raw:

1Book.objects.raw('select * from hello_Book')

自定义sql:

1Book.objects.raw("insert into hello_author(name) values('测试')")

rawQuerySet为惰性查询,只有在使用时生会真正执行。 可参考https://www.cnblogs.com/fmgao-technology/p/10119671.html#_labelTop

10.分页显示数据

python后端: urls.py:

1from django.conf.urls import url 2from django.contrib import admin 3from app01 import views 4urlpatterns = [ 5 url(r'^admin/', admin.site.urls), 6 url(r'^index1$', views.index1), 7] 8

views.py:

1from django.shortcuts import render 2from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage 3# Create your views here. 4 5#简单的创建出很多的数据来试验 6USER_LIST=[] 7for i in range(1,999): 8 temp={'name':'root'+str(i),'age':i} 9 USER_LIST.append(temp) 10 11 12def index1(request): 13 # 全部数据:USER_LIST,=》得出共有多少条数据 14 # per_page: 每页显示条目数量 15 # count: 数据总个数 16 # num_pages:总页数 17 # page_range:总页数的索引范围,如: (1,10),(1,200) 18 # page: page对象(是否具有下一页;是否有上一页;) 19 current_page = request.GET.get('p') #当前页码 20 current_page=int(current_page) 21 # Paginator对象 22 paginator = Paginator(USER_LIST,10) # 一页放10个数据 23 24 #加判断当总页数大于10页 让一部分不显示出来 25 if paginator.num_pages > 10: 26 if current_page - 5 < 1: 27 posts_list = range(1, 11) 28 elif current_page+ 5 > paginator.num_pages: 29 posts_list = range(current_page - 5, paginator.num_pages + 1) 30 else: 31 posts_list = range(current_page - 5, current_page + 5) 32 else: 33 #当小于等于10页时全部显示 34 posts_list = paginator.page_range 35 36 try: 37 # Page对象 38 posts = paginator.page(current_page) 39 # has_next 是否有下一页 40 # next_page_number 下一页页码 41 # has_previous 是否有上一页 42 # previous_page_number 上一页页码 43 # object_list 分页之后的数据列表,已经切片好的数据 44 # number 当前页 45 # paginator paginator对象 46 except PageNotAnInteger: 47 posts = paginator.page(1) 48 except EmptyPage: 49 posts = paginator.page(paginator.num_pages) 50 51 return render(request, 'index1.html', {'posts': posts,"posts_list":posts_list})

前端显示: index1.html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6</head> 7<body> 8<ul> 9 {% for row in posts.object_list %} 10 <li>{{row.name}}----------------{{row.age}}</li> 11 {% endfor %} 12</ul> 13{% if posts.has_previous %} 14 <a href="/index1?p={{posts.previous_page_number}}">上一页</a> 15{% else %} 16 <a href="#">上一页</a> 17{%endif%} 18 19{% for index in posts_list%} 20 {% if index == posts.number %} 21 <a href="#" style="color: black">{{index}}</a> 22 {% else %} 23 <a href="/index1?p={{index}}">{{index}}</a> 24 {% endif %} 25{% endfor %} 26 27{% if posts.has_next %} 28 <a href="/index1?p={{posts.next_page_number}}">下一页</a> 29{% else %} 30 <a href="#">下一页</a> 31{%endif%} 32<span> 33 {{posts.number}}/{{posts.paginator.num_pages}} 34</span> 35 36 37</body> 38</html> 39

本文原文首发来自博客专栏Python Web开发实战,由本人转发至https://www.helloworld.net/p/50eC3xc47iVD,其他平台均属侵权,可点击https://blog.csdn.net/CUFEECR/article/details/104028451查看原文,也可点击https://blog.csdn.net/CUFEECR浏览更多优质原创内容。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''