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

1.前后台的数据传递

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

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

HTML中用 {{}} 获取数据

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

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

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

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

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

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

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

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

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

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

def function(request):
    if request.POST:
        if 'update' in request.POST:
            ...      #update功能实现
        else:
            ...      #del功能实现
        return render(request, 'xxx.html', yyy)

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

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

<form method="post" action=""> 
<!-这个method代表方法,方法一般有两个一个是'post',一个是'get',action是提交表单到何处,可填写一个网址。不填则默认到本页面。>

{%csrf_token%} 
<!-这个是django中的一个标签,用于防止恶意攻击使用,如果不加入这个标签,会遇到不能提交的问题,处理麻烦一点,建议加上。>

<input name="select" type="radio" value='radio'>
<!-这就是一个单选标签,多选为type='checkbox'。 value是显示的内容,并且后端提交后也将此作为值,其中name是后端获取时所用的如后端使用 select = request.POST['select']获取这个单选按钮的value,另外也可以用select = request.POST.get('select',None)来获取。>

<input name="submit" type="submit" value="提交" />
<!-这就是一个提控件,其中的type='submit'会保证点击后表单(<form></form>)中的内容被提交到后端。>

<input name="text" type="text" value="" />
<!-一个输入框>

</form>

<!-表单结束>

前端HTML代码:

<!DOCTYPE html>

<html lang="en">

<head>

 <meta charset="UTF-8">

 <title>Title</title>

</head>

<body>

<form method="post" action=""> 

{%csrf_token%}

<input name="select" type="radio" value='radio'>

<input name="text" type="text" value="" />

<input name="submit" type="submit" value="提交" />

</form>

</body>

</html>

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

def receive_data(request):
if request.POST: # 如果数据提交
	print('有提交')
	select = request.POST.get('select',None)
	text = request.POST.get('text',None)
	print(select,text)
return 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注册部分自定义注册

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',  # 自定义APP注册
]

后端views.py中

from django.contrib import messages

def abc(request):
    messages.debug(request, '%s SQL statements were executed.' % count)
	messages.info(request, 'Three credits remain in your account.')
	messages.success(request, 'Profile details updated.')
	messages.warning(request, 'Your account expires in three days.')
	messages.error(request, 'Document deleted.')

或者

from django.contrib import messages

def abc(request):
    messages.add_message(request, messages.INFO, 'Hello world.')

前端显示

{% if messages %}
    <script>
        {% for msg in messages %}
            alert('{{ msg.message }}');
        {% endfor %}
    </script>
{% endif %}

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()表达式 进行相对更新操作

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

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

9.执行原始sql语句

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

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

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

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

自定义sql:

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

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

10.分页显示数据

python后端:
urls.py:

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index1$', views.index1),
]

views.py:

from django.shortcuts import render
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
# Create your views here.

#简单的创建出很多的数据来试验
USER_LIST=[]
for i in range(1,999):
    temp={'name':'root'+str(i),'age':i}
    USER_LIST.append(temp)


def index1(request):
    # 全部数据:USER_LIST,=》得出共有多少条数据
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象(是否具有下一页;是否有上一页;)
    current_page = request.GET.get('p')  #当前页码
    current_page=int(current_page)
    # Paginator对象
    paginator = Paginator(USER_LIST,10)   # 一页放10个数据
    
	#加判断当总页数大于10页 让一部分不显示出来
    if paginator.num_pages > 10:
        if current_page - 5 < 1:
            posts_list = range(1, 11)
        elif current_page+ 5 > paginator.num_pages:
            posts_list = range(current_page - 5, paginator.num_pages + 1)
        else:
            posts_list = range(current_page - 5, current_page + 5)
    else:
    	#当小于等于10页时全部显示
        posts_list = paginator.page_range
        
    try:
        # Page对象
        posts = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表,已经切片好的数据
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    return render(request, 'index1.html', {'posts': posts,"posts_list":posts_list})

前端显示:
index1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    {% for row in posts.object_list %}
    <li>{{row.name}}----------------{{row.age}}</li>
    {% endfor %}
</ul>
{% if posts.has_previous %}
    <a href="/index1?p={{posts.previous_page_number}}">上一页</a>
{% else %}
    <a href="#">上一页</a>
{%endif%}

{% for index in posts_list%}
    {% if index == posts.number %}
        <a href="#" style="color: black">{{index}}</a>
    {% else %}
        <a href="/index1?p={{index}}">{{index}}</a>
    {% endif %}
{% endfor %}

{% if posts.has_next %}
    <a href="/index1?p={{posts.next_page_number}}">下一页</a>
{% else %}
    <a href="#">下一页</a>
{%endif%}
<span>
    {{posts.number}}/{{posts.paginator.num_pages}}
</span>


</body>
</html>

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Django是一个开源的Web应用框架,使用Python语言开发。它简化了Web应用开发的过程,提供了许多便捷的功能和模块,使得开发人员能够更快速、高效地开发出符合需求的Web应用。 从入门到实践,学习Django开发需要掌握以下几个方面: 1. 环境搭建:首先需要安装PythonDjango开发环境。可以通过pip命令安装Django,并搭建一个虚拟环境来管理项目。 2. 项目创建:使用Django的命令行工具创建一个新的Django项目。这将生成项目的基本结构和文件,包括配置文件和应用程序。 3. 数据库配置:在Django中使用数据库,需要在配置文件中设置数据库连接信息。可以选择常用的关系型数据库,如MySQL或SQLite。 4. URL配置:Django使用URL映射来处理用户的请求。在项目的URL配置文件中,将URL和对应的处理视图函数进行绑定。 5. 视图函数:Django的视图函数负责处理请求,并返回相应的响应。可以在视图函数中编写逻辑代码和业务逻辑。 6. 模板引擎:Django内置了强大的模板引擎,用于生成动态的HTML页面。可以在模板中使用Django提供的模板语法,包括变量、标签和过滤器等。 7. 表单处理:Django提供了方便的表单处理功能,可以用于处理用户输入的数据。可以根据需求创建自定义的表单类,并进行表单验证和处理。 8. 中间件:Django的中间件是位于请求和响应之间的处理组件,可以在请求处理过程中进行一些自定义操作,如身份验证、请求记录和缓存等。 9. 数据库操作:Django提供了ORM(对象关系映射)工具,可以通过Python代码进行数据库操作,而不用直接编写SQL语句。 10. 部署上线:当开发完成后,需要将项目部署到生产环境中。可以选择合适的服务器和Web服务器,如Nginx和Apache,进行部署和配置。 通过学习以上内容,我们可以掌握Django开发流程和常用模块的使用。通过实际的项目开发,可以深入理解Django的各个方面,并逐渐掌握高级的开发技术和扩展功能。 ### 回答2: Django是一个开源的Web应用框架,使用Python语言编写。它通过提供一组强大的工具和接口,帮助开发者快速构建高效、可扩展的Web应用程序。 从入门到实践,首先我们需要掌握Python语言的基础知识,了解Python的语法和常用库函数等。接着,我们可以开始学习Django框架的使用。 在学习过程中,我们需要熟悉Django的核心概念和组件,例如模型(Model)、视图(View)和模板(Template)等。模型用于定义数据结构,视图处理用户请求并返回响应,模板用于渲染动态页面。掌握这些基本概念后,我们可以开始进行实践。 实践中,我们可以开发一个典型的Web应用,如博客网站。首先,我们需要定义博客的数据结构,例如文章、作者和评论等。然后,我们可以创建相应的模型,并通过Django提供的数据库迁移工具生成数据库表格。 接着,我们可以编写视图函数来处理用户请求。例如,当用户访问博客首页时,我们可以查询数据库获取最新的文章列表,并通过模板渲染页面后返回给用户。当用户点击某篇文章时,我们可以根据文章的ID查询数据库,获取文章的详细内容并显示在页面上。 在开发过程中,我们可能还需要创建用户注册、登录和退出等功能。这时,我们可以使用Django提供的用户认证和管理模块,轻松实现这些功能。 最后,我们还可以通过Django的后台管理功能方便地管理数据。Django提供了一个自动生成的管理界面,我们可以通过简单的配置即可实现对数据的增删改查操作,而无需编写额外的代码。 总之,通过从入门到实践的学习和实践,我们可以掌握Django开发技巧和典型模块的使用,从而能够快速开发出高效、可扩展的Python Django Web应用程序。 ### 回答3: Django是一个开放源代码的Python Web应用程序框架,它通过提供一个简单方便的开发环境,帮助开发人员快速构建高质量的Web应用程序。 从入门到实践,首先需要掌握一些基本的Python编程知识。Python具有简单易学的语法和丰富的标准库,对于初学者来说,上手较为容易。接下来,了解Django框架的设计理念和基本概念是必不可少的。Django采用了MVC(模型-视图-控制器)的架构模式,其中模型负责数据处理和存储,视图负责处理用户请求和渲染HTML模板,控制器负责协调模型和视图之间的交互。 在开发过程中,使用Django提供的典型模块是非常常见的。其中最重要的模块之一是ORM(对象关系映射),它能够将数据库中的数据映射为Python对象,并提供了一种直观的方式来操作数据库。ORM能够简化数据库操作,并提供了一致的API,使得开发更加高效和可维护。另外,Django的表单模块也是非常重要的,它能够帮助我们在Web应用程序中处理用户输入,并进行验证和数据清洗。表单模块提供了丰富的字段类型和验证器,使得表单开发更加简单和高效。 除了ORM和表单模块,Django还提供了许多其他有用的模块,例如身份认证和授权模块、缓存模块、国际化和本地化模块等等。这些模块能够帮助我们快速构建功能强大的Web应用程序。 在实践中,我们可以通过参考Django官方文档、教程和案例来学习开发技巧和最佳实践。同时,参与开源项目和与其他开发者交流也是非常重要的,可以提升自己的开发能力和不断学习新技术。 总之,通过学习Python编程基础、掌握Django框架的基本概念和典型模块,以及不断实践和参与开发社区,我们可以逐步提升自己的Django开发技能,从而构建出高质量的Web应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI码东道主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值