django框架从零开始_007_view以及模版页

什么是Django? 在这第一篇Django文章中,我们来讨论一下“什么是Django?”这个问题,并概述这个网络框架有什么特性和功能,包括一些高级功能,还会展示一些Django应用程序的主要构建模块,但我们并不会在本节中详细介绍,因为此时你还没有相应的DJango开发环境。 阅读详情

参考:https://docs.djangoproject.com/en/1.9/intro/tutorial03/#write-views-that-actually-do-something


下面让我们来做一些真正有意义的view页面。一个view应该要么返回一个包含请求页面内容的HttpResponse,或者抛出一个异常(比如Http404)。而在view处理过程中你可以做任何你需要的事情(读取数据库等),也可以利用任何你需要的python库。一切都如你所愿。(有点像controller+view)

django需要的,只是一个HttpResponse,或者异常。


OK,我们利用上次数据库教程中用到的Question和Choice,来把polls的index做成问题展示页面。

polls/views.py:

from django.shortcuts import render
from django.http import HttpResponse
from .models import Question

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    output = ','.join([q.question_text for q in latest_question_list])
    return HttpResponse(output)
其余部分不变。

看起来很清楚,但是这引出了一个问题:我们用到的输出都在views里写死了,一旦修改页面需要修改views代码。所以我们利用django的模版系统来建立一个view可以用的模版。

首先,你需要在"polls"目录下建立一个"templates"目录。django将会在这个目录下寻找模版文件。关于django的模版设置可以参看:https://docs.djangoproject.com/en/1.9/ref/settings/#std:setting-TEMPLATES。默认情况下,django的模版会去寻找你的apps的templates文件夹寻找模版。

在templates文件夹建立好之后,我们再建立一个polls文件夹,然后在其中建立index.html文件。这样,我们的路径看起来就像mysite/polls/tempaltes/polls/index.html。django去寻找的时候,会在我们的polls/templates下寻找到polls/index.html文件。这样的路径虽然看起来有点怪异,但是尽量不要省略到后边的polls目录,因为django如果找到多个apps下的templates文件夹下有重路径重名的文件时是分不出来哪个是哪个的。

修改polls/templates/polls/index.html:

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

同时更新polls/views.py:

from django.shortcuts import render
from django.http import HttpResponse
from .models import Question
from django.template import loader

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    # output = ','.join([q.question_text for q in latest_question_list])
    # return HttpResponse(output)
    template = loader.get_template('polls/index.html')
    context = {
        'latest_question_list' : latest_question_list
    }
    return HttpResponse(template.render(context, request))
这段代码会调用polls/index.html并传递context参数。context是一个包含变量和值的dict。来访问:http://localhost:8000/polls/,如下效果:

页面生成成功!

这个index方法的写法是正统写法(读取template,填入context,返回HttpResponse)。此外,django还提供了一种简单的写法:render()。我们用它来覆盖刚才的index:

polls/views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Question

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    # output = ','.join([q.question_text for q in latest_question_list])
    # return HttpResponse(output)
    # template = loader.get_template('polls/index.html')
    # context = {
        # 'latest_question_list' : latest_question_list
    # }
    # return HttpResponse(template.render(context, request))
    context = {'latest_question_list' : latest_question_list}
    return render(request, 'polls/index.html', context)

可见,我们并不需要import loader和HttpResponse了(代码里仍然import了是因为余下的几个方法还是返回的HttpResponse)。render方法第一个参数为request对象,第二个参数为模版文件名,第三个参数为变量字典。他返回一个HttpResponse。


学习了正常页面之后,让我们来看看如何声称Http404错误。

让我们简单修改一下detail方法:

from django.shortcuts import render
from django.http import Http404
from django.http import HttpResponse
from .models import Question

......

def detail(request, question_id):
    # return HttpResponse("You're looking at question %s." % question_id)
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})

(把render放在try块中也不影响结果)

同时简单新建一个polls/templates/polls/detail.html文件:

{{ question }}

让我们来看看结果。访问存在的question时:

访问不存在的question时:

是一个详细的带debug值的页面。根据提示,修改mysite/settings.py中:

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

ALLOWED_HOSTS = ['*']
部分,可见标准standard error页面:

我们设定的404信息就不见了。


刚才的写法也是非常正统的:尝试get相应对象。对象不存在时获取Exception,抛出异常。下面再介绍一个简单写法:get_object_or_404()。views样例如下:

from django.shortcuts import render, get_object_or_404

......

def detail(request, question_id):
    # return HttpResponse("You're looking at question %s." % question_id)
    # try:
        # question = Question.objects.get(pk=question_id)
        # return render(request, 'polls/detail.html', {'question': question})
    # except Question.DoesNotExist:
        # raise Http404("Question does not exist")
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question':question})
get_object_or_404使用request作为第一参数,以及任意长度的参数作为传递给get()方法的参数。如果object不存在则返回Http404。为何要有这么一个简写的方法呢?因为原来的方法容易导致model和view紧耦合。现在最新的潮流是使用松耦合。

类似的shortcut方法参加:https://docs.djangoproject.com/en/1.9/topics/http/shortcuts/#module-django.shortcuts。


下面让我们来更多的了解模版页。回到detail方法,修改polls/detail.html页面:

<h1>{{ question.question_text}} </h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{choice.choice_text}}</li>
{% endfor %}
</ul>
可见模版系统使用了dot-lookup语法来寻找对象和对象的属性/方法。在{% for %}方法中调用了question.choice_set.all,相当于python中的question.choice_set.all()方法。关于他们的用法参考:https://docs.djangoproject.com/en/1.9/topics/templates/。


进行到这里,一切似乎都很美好。但是设想一下,如果我们修改了detail的页面地址,比如从polls/{id}/变成polls/specifies/{id},那么很多硬写死的url链接就需要去修改(也许你已经忘了,在polls/index.html里有

<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
这个东西(卧槽)。。当模版多起来的时候,修改这些写死的地方就会变成噩梦。好在django提供了一个url方法来搞定:

<li><a href="{% url 'detail' question.id%}">{{ question.question_text }}</a></li>


看起来很神奇哦!实际上,他和我们定义的polls.urls模块中的参数是相对应的。在polls.urls.py中,我们写过:

urlpatterns = [
    ......
    # ex: /polls/5/
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    ......
]
在页面中的url方法就回去找到这个配置,并把相对应的url读取出来。 例如我们修改urls.py为

    url(r'^something/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),

那么在index中,点击question,我们就会自动跳转到:

注意url,已经变成了something/1了。


如果网站安装了多个apps,而某些apps的url具有相同的配置,那么,你需要对url进行namespace定义。方法是:在app/urls.py中,定义app_name属性,例如:

polls/urls.py:

from django.conf.urls import url
from . import views

app_name = 'polls'
urlpatterns = [
    # ex: /polls/
    url(r'^$', views.index, name='index'),
    # ex: /polls/5/
    url(r'^something/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    # ex: /polls/5/results/
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    # ex: /polls/5/vote/
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

在相应的页面上,就可以使用:

<li><a href="{%url 'polls:detail' question.id%}">{{ question.question_text }}</a></li>
注意polls:detail。







保姆级教程:用Fiddler+夜神模拟器搞定抖音App抓包(附SSL Pinning绕过实战) 本文提供了一套完整的移动端抓包解决方案,详细介绍了如何使用Fiddler和夜神模拟器进行抖音App抓包,并重点讲解了SSL Pinning绕过技术。通过Xposed框架和JustTrustMe模块的组合,实现高效抓包,适用于产品分析、竞品研究和安全测试等场景。 阅读详情

相关推荐

Dify+工作流,通过多模态实现发票自动识别

上个章节我们用Dify实现了基于本地知识库的聊天助手,本节我们通过工作流 ,可视化界面快速构建复杂的工作流和自动化流程。结合 OCR(光学字符识别)技术和工作流引擎,可以实现发票的自动识别、数据提取以及后续的审批流程。本文将详细介绍如何使用 Dify 和工作流来实现发票的自动识别与审批。

odin2005的博客 7425

数据库数据写入前端的模态框(Django,Bootstrap,Ajax,数据库)

自从5月22离开实验室522及毕业之后,再也没有写过博客,主要原因是入职一个月以来,基本就是各种培训,公司培训、部门培训、室内培训主要是熟悉公司业务,真正好好学东西的时间也很少,也没啥写的。正好趁着周末加两天班学了点前端数据库和后端的相关知识,想总结一下。 实现功能: 将数据库里的数据通过异步加载的方式(点击该条的时候加载,不点击的时候不加载),写入前端的模态框。图1是前端模态框,图二是图一详...

Strive_0902的博客 3422

MT6768平台Sensor Bring Up全流程实战:从驱动添加到问题排查(附避坑指南)

本文详细介绍了联发科MT6768平台Sensor Bring Up的全流程实战指南,从驱动添加、硬件配置到问题排查,提供了全面的避坑建议。内容涵盖环境准备、驱动文件集成、硬件接口配置、编译系统适配以及常见问题解决方案,帮助开发者高效完成传感器集成与调试工作。

weixin_30374009的博客 416

Django初识(6.常用视图之CreateView)

Django初识(6.常用视图之CreateView)

weixin_51803729的博客 2339

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 751

Vmware虚拟机克隆详解:固定ip + 修改uuid等内容

分两大步 设置固定ip 克隆后修改相关配置 本文引用的其他地方的图片。会附上链接 若侵权,删 一、设置静态ip 先进行虚拟网络的编辑 接下来的操作需要管理员权限。(给权限就完事了) 接下来设置网卡: 网络和共享中心→ 更改适配器设置→VMware Network Adapter VMnet8 -> 右键属性 修改TCP/Ipv4的配置,网上常见是这种,笔者是英文的...

Unknownfuture的博客 9070

python编写应用程序错误_404“编写第一个Django应用程序”教程中的错误

我是编程新手,一直在为1.8版编写“编写您的第一个Django应用程序”教程。我被一个错误困住了。Page not found (404)Request Method: GETRequest URL: http://localhost:8000/pollsUsing the URLconf defined in mysite.urls, Django tried these URL patt...

weixin_39765588的博客 587

【Dify系列教程重置精品版】第二章:在Windows上部署Dify

让我们的电脑允许使用Linux系统。有点兴奋是怎么回事?简单来说就是让你的电脑拥有另一个叫做Linux的系统。3.选择“适用于Linux的Windows子系统”与 “虚拟机平台”与“Hyper-V"第1章:安装 wsl (Windows Subsystem for Linux)上一章我们聊了什么是Dify,这一章我们讲一下怎么才能用Dify。好了,我们的环境部署好了,下一章我们正式进入Dify。下载完成后,我们直接一直无脑下一步,安装即可。完成上述步骤,我们就可以开始安装wsl了。我们的虚拟化也是开启的。

xiezhipu的博客 866

Django类视图之——CreateView。网站中经常用到的功能,Django宝妈早就帮你想好了。

Django类视图之——CreateView Django类视图,就是为了简化开发,提高效率而存在。网站中经常会用到的功能,Django宝妈怎么会没有帮你想到呢? 网站中经常用到的功能,从类的创建,新增。我们需要构建模型,编写视图,创建表单,设计模板等几项步骤。 例如:新增一个博客的类,并且做出写博客的功能。 入门的方法: 设计models、编写views函数视图、创建forms表单、设计html模板,当然不能忘了添加urls路由。 类视图方法: 设计models、 设计model时把get_absolut

m0_47812755的博客 955

PCL学习笔记(四)——点云曲面重建

文章目录一、凸包算法二、 单纯的点云数据固然很好,但仅仅是点的话仍是不够的,因为这不利于我们后续对实体对象的渲染与各种应用,如计算实体的表面积、体积等等,所以这就需要我们对实体进行点云的曲面重建。 一、凸包算法 在计算机图形学中,凸包是指在任意维空间中包含某一有限点集P的最小凸集,它由凸包顶点构成,在二维上其表现形式为一个凸多边形,而在三维上则表现为一个凸多面体。在二维层面上来讲,最常用的凸包算法有Graham扫描法和Jarvis卷包裹法,但前者并不适用于三维层面,后者倒是可以扩展到三维。除此之外,在

dayuhaitang1的博客 6912

YOLOv11改进 | 注意力篇 | YOLOv11引入24年最新的ELA注意力机制,并构建C2PSA_ELA

为了解决这些限制,本文介绍了一种高效的本地注意力(ELA)方法,实现了一个简单的结构,大幅度的性能改善。我们精心设计了ELA中的三个超参数,产生了四个不同的版本:ELA-T,ELAB,ELA-S和ELA-L,以满足不同视觉任务的具体要求,如图像分类,目标检测和语义分割。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

tsg6698的博客 1285

Django笔记四 视图和模板

视图 一个视图就是一个页面,提供特定的功能。在Django中,视图其实就是一个简单的python函数(通过函数来处理视图的叫做函数视图,还有一种通过类中的方法来处理视图,这种叫做类视图) 在polls/views.py文件中输入以下代码,会根据发布日期显示最近的5个投票问卷 from django.http import HttpResponse from .models import Question # Create your views here. def index(request):

梦忆安凉的博客 473

目标检测YOLO实战应用案例100讲-基于YOLOv7的番茄采摘机械手场景感知及试验(下)

根据软件系统的设计需求,制定系统的可行性方案分析,编写系统的相关程序和 调试运行环境,对系统进行测试,以实现对番茄数据的采集及监测。登陆界面登陆后,进入选择界面,菜单包括了对番茄种植棚室的固定相机数据的监测、 对番茄采摘机械手的双目相机采集的番茄的静态、动态数据的获取、对番茄静态、动态数 据处理的功能菜单等选项。与利用人工去进行对于番茄果实的识别和数目的统计相比,番茄视觉系统自动记录番 茄数量以及红色已经成熟的番茄、青色未成熟番茄的数量,减轻人工记录的工作量,减少 人工记录的误差,从经济方面是可行的。

qq_36130719的博客 812

基于Django框架的静态个人名片网站设计

本文介绍了如何使用Django框架快速开发一个静态个人名片网站,适合Python Web开发新手入门。教程涵盖Django核心的MVT(Model-View-Template)架构实现,包括创建项目与应用、定义数据模型、配置后台管理、编写视图逻辑和模板渲染等关键步骤。通过该项目,读者将学会使用SQLite数据库存储项目经历数据,利用Django Admin后台管理内容,并最终实现一个包含个人基本信息、技能展示和动态项目列表的名片页面。教程提供了清晰的代码示例和配置说明,帮助开发者快速掌握Django的基础开

分享 AI 与开发实践,项目源码及更多内容请访问 GitHub:https://github.com/Elaine-one 231

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

初识Django框架

今天开始对Django开始学习了,对于一个小白来说经常听到开发说什么MVC、MTV的,感觉好高深的样子,下面在学习Django之前先来介绍一下什么是MVC&MTV。 一、MVC&MTV MVC:全名ModelViewController,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界...

die8252的博客 187

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

从零开始:Django初学者的实战之旅

本文专为Django初学者打造,通过实际案例一步步引导你从环境搭建到项目部署的全过程。你将了解如何安装Django、创建项目和应用,并深入掌握模型、视图和模板等核心组件的使用。文章还涵盖了Django内置管理后台的配置及数据库操作等实战技巧,帮助你快速上手,迈出Web开发的第一步。

Five的博客 2544

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【007】- Django Rest API简介

本篇接上篇内容,我们学习Django视图。学习之前,我们首先声明,我们主要以目前比较流行的前后端分离思想为主。本篇只是进行一个演示,后续我们将会介绍专门的Rest API方式—Rest Framework。 在前面我们在models.py中定义了两个模型类,分别为User和Role class User(models.Model): """ 用户模型类 """ SEX_CHOICE...

zhangxiongcolin的专栏 424

007基于django+Python的农业害虫识别系统设计与实现

Python的扩展性也很好,其可以利用c语言编写模块,编译链接到解释器,从而使Python能够调用该c模块中的接口。反之,C语言也能将Python解释器连接到C中,从而在C中调用Python。因此Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,其设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。Flask是目前十分流行的web框架,采用Python编程语言来实现相关功能。

Q_860234001的博客 770

007-基于django西西家居全屋定制系统的设计与实现

本系统是基于Django框架的西西家居全屋定制系统,旨在为家居行业提供高效、智能的定制解决方案。系统以个性化设计、高效服务、优质材料和智能化生产为核心特点,致力于为用户打造高品质、个性化的居住环境。采用Python技术和MySQL数据库技术进行开发,主要功能涵盖首页、用户、设计师、家具分类、信息、定制、分配、数据、公告信息、系统管理、订单管理及个人信息等模块。通过B/S架构确保系统稳定性与可扩展性,前端结合HTML、CSS和JavaScript实现友好交互界面。

2301_77541824的博客 935

Django-Web框架之创建项目和应用

Django我们是基于python3来演示的。首先我们来安装一下django框架。使用pip3 install django安装的是最新的版本: 我们在pycharm中创建django工程。如图所示: 打开后,窗口报错如下: 解决方法:https://blog.youkuaiyun.com/qq_41185868/article/details/80599336 pip...

weixin_30657999的博客 83

Django学习——全局templates引用的问题

一、问题在构建网站的时候我们会用到全局的templates处理错误的网页,此时我们需要对urls进行一个映射,使得在使用的时候避免重复调用。在使用的时候还会产生错误代码:第一个是404界面的,第二个是500界面的(Django:2.2.2) ?: (urls.E007) The custom handler404 view 'index.views.page_not_found' ...

weixin_30266885的博客 393

Django--007 DRF-serializers和view的灵活应用

灵活应用DRF---serializers和view满足不同的需求

qq_25672165的博客 386

django之memcache缓存

django 进来,执行parse,request 出去,执行parse,response 一个中间件写parse,request。一个中间件写parse,response方法。 一,memcache缓存,Django中提供了6种缓存方式: 开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块) Memcach...

188

Django-Web框架之Hello Django!

1.首先我们配置guest目录下面的settings.py问,将我们的sign应用添加到项目中.如下图所示: 2.我们通过地址栏:http://127.0.0.1:8001/index/访问Django项目登录后发现报404 这个错误是访问的路径不存在。原因是django在项目的guest子目录下面通过urls.py文件来定义URLconf 但是在urls文件中只能找到一个admin...

weixin_30594001的博客 111

007--Django(cookie和session)

1.Cookie Cookie介绍 Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。 Cookie,实际上是一小段存储在用户浏览器中的文本信 Cookie的机制 1.客户端向服务器发起请求,如果服务器需要记录该用户状态,就通过响应向客户端浏览器颁发Cookie 该Cookie中需要包含用户的唯一信息 2.客户端浏览器会把Cookie保存起来 3.当浏览器再次请求该网站是,浏览器会把请求的网站连同Cookie一同提交给服务

vic4399的博客 151

007 Django url 反向解析

url反向解析是指在视图或模板中,用path定义的名称来动态查找或计算出相应的路由模板中 - 通过 url 标签实现地址的反向解析例如 视图中如何使用反向解析 在视图函数中->可调用django中的reverse方法进行反向解析 例子 此时我们自动反向解析的值赋值给 url, 然后我们再使用302跳转到指定路由...

m0_52475295的博客 198
上一篇: django框架从零开始_006_draft views
下一篇: django框架从零开始_008_页面元素 表单处理
maxwheel
博客等级 码龄19年 4粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值