使用pycharm开发web——django2.1.5(四)视图和模板相关
刘老师说这块很重要。。。。。
应该是很重要,大概看了一下,这里面关于views中函数作用,大概看来可能就是相应请求,传入数据和跳转,基本功能上貌似这些框架都差不多吧(其实我并没用过3个框架以上。。。。)
从功能上想,网站必然包含了许多实现具体功能和数据展示的页面,而现在在做的就是构成这些。
那么一个网页他的样子(模板)就是html,那么他的灵魂在这里就是views。这样想似乎就比较清楚。
在构思的时候都是默认躯体存在,设计者需要先设置他的灵魂
在polls/views.py中添加如下函数:
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id):
response = "You're looking at the results of question %s."
return HttpResponse(response % question_id) def vote(request, question_id):
return HttpResponse("You're voting on question %s." % question_id)
这里可以大概得出结论,我们在views.py中做的所有函数几乎都是返回了一个HttpResponse对象
这个对象呢有这样几个属性:
content:表示返回的内容,字符串类型
charset:表示response采用的编码字符集,字符串类型
status_code:响应的HTTP响应状态码 404什么的
content-type:指定输出的MIME类型
写好这几个函数,也就需要配置一下二级路由,服务器找到app polls的路径我理解为了这里的一级路由,是在pysite(我的web项目名)的urls里面配置的,那么当在app之下在有页面时候同样就需要在polls的urls中进行路径配置,好让服务器找到对应的地址。
from django.urls import path from . import views urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
<int:question_id> 这个东西,这样想,某个int类型的值,传进来并将其赋给question_id变量,还记得前面我们在views中写的函数吗,其中参数除了request之外还有一个question_id,简直伏笔,刘老师真骚人也。。。。
牛人写书往往也这样,开始看的你头疼,知道看到某处,武功及大成,融会贯通,一通百通。
这时候你在localhost:8000/polls/某个数字 访问的时候就会对应的出现不同效果,看detail函数就能理解到。
这些能看得到就证明灵魂已经能运转了,虽然他还没有躯体,可能就像一个嗷嗷待哺的贾维斯一样吧,史塔克牛逼
path()达成的效果是这样的,这里已经是在找二级路由也就是,从你地址栏输入的polls/后面开始找满足参数里面那个正则形式的,就调用视图下某个函数
比如在
path('', views.index, name='index'),即为如果polls/后面莫得东西,那就走index函数去进行跳转传参,
path('<int:question_id>/', views.detail, name='detail'),如果polls/后面只跟了一个数字 那就调用那个views中叫detail的函数
and so on 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 然后刘老师搞了个能调用数据库中信息展示的函数,也就是把detail进行了改变,让页面能正儿八经做些事,而不是傻冒的打印一句绝大多数字不会改变的字符串
更改一下vies.py
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)
学过mysql你看见order by 就知道他要排序,根据时间的相反数,鬼知道为什么要用1970年到其日期之间的毫秒数,知道也不想理解,内心无法接收。所以他这里根据时间的相反数,可以想象,这个毫秒数越大时间越“新”,这里不用多想,框架后面对应的必然有一条ORDER BY语句,那个是要传一个列进去,这句话默认是升序的,如果这样的话,最新的时间就会排在最下面了。而我们想要的影噶是把最新的放在上面,后来者居上,这就解释得通了。(强行解释)
好的detail有了他的灵魂,你还需要给他一个躯体,这怎么感觉像是在看复仇者联盟2一样,旺达的老公要出来了,搞了这么久原来是托尼给贾维斯找了个女朋友,还送了个定情原石。哦!woc,女朋友,,,,,女。。。。。。。,是啊百合是多么纯洁而浪漫
咳咳,继续
django中提到一个渲染,说白了就是用一个HttpResponse对象把东西传过去。然后页面再执行一些东西,页面,想想能干啥?不就是显示屏和输入设备的功能吗,给你看和让你点让你敲。
在这里,当我们创建项目的时候就有一个雪青色的文件夹放在那里,叫做templates。。。。。(邪恶),这里只是拿出来说这个名字,你要放的模板不在这里,你需要在你对应的app的目录下面新建一个文件夹叫做templates,而且在这之下新建一个和app同名的文件夹比如这里的路径是polls/templates/polls/
这里是你接下来要存放模板的地方,这样做是为了解决一些共有问题,很多时候集体主义状态很乱,虽然现实中多数由于管理者能力不足导致,但是本身确实有局限性,比如这里说你们都是女生,那么单说女生,谁知道找哪一位呢?集体主义有时候强制把一些东西变成了公共状态,而如果设定不是很合理就必然会乱,想想感觉得到,当然事物是相对的,集体的弊端需要个人弥补,个人也有难以单独实现的事情。阴阳调和即可。
所以请按照这个规范来创建,圈里都这样 干,你干是不干?刘老师教程说叫做独立命名空间,帅气
由于接下来要在index页面搞事情,
先吧index的灵魂写好:
数据库是要自己搞的哦,具体参考前面的篇章
在views.py中修改:
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
创建好目录之后进去新建一个html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
{#被注释 <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>#}
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
</body>
</html>
这就是现在的效果,里面加了一个超链接,超链接的内容是从数据库中查询到的question_text的内容,如果想去做些很好看的页面,建议去mooc看html、css等学一翻就好,人活着没意思,让你前进的是好奇心。
然后刘老师告诉你,刚才的写法过时了,嘿嘿,我们现在用render()
每次自己看东西到这种就感觉很******,但是好在这样是一个理解的过程
来,再改views.py
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
但是注意了,这里几个不同的方法,最终实际上都是一个HttpResponse对象,是不是一种万物归一的感觉,茅塞顿开
然后刘老师讲了异常处理,这里也就是404的而已
开始是这样的(views.py):
from django.http import Http404
from django.shortcuts import render from .models import Question
# ...
def detail(request, 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})
然后是这样的:
from django.shortcuts import get_object_or_404, render from .models import Question
# ...
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
一jio吧try except踢到九霄云外,就用而言,请你直接上高级的。
好的,现在再去写一个detail的模板
看看视图中detail方法(函数)中的语句,从数据库表(类)Question model对应的表中取到主键等于传入question_id的Question对象并把它字典形式传入并渲染模板
detail.html 放在哪里就不用说了,都是polls的模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>detail</title>
</head>
<body>
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
</body>
</html>
由于在写model时候说过的,这里的Question和Choice是有所关联的,两个类就可以相互去做一些查询,算是django的骚操作了,所以当把question传过来后,detail.html就开始疯狂的使用他,而遍历数据却在choice的表中
这就很有意思了
那么效果是:
删除模板中硬编码的urls
什么叫硬编码的urls?打个比方,有一波人卖房子的人,另一波叫卖房子的人,卖房子原来自己联系买家,结果这些人又很恶心,一会儿想买一会儿不想买,搞来搞去,同一个买家找人找的快费劲死,后来这些卖家全干掉,交给中介去高了,对于买家来说,只要应付中介就完事了。。。。。说了好长
这里的硬核url就是那种耐冲击性很差的存在,这个词好像是在水污染控制工程里面第一次学,某些东西无法抵抗水质的突变
当我们的路径发生变化的时候,如果html页面上直接填写的是页面路径,那就需要重新修改这个地方,一处改一个,一万处就凉凉,所以这里要用别名
对比一下index中的两句:
{#被注释 <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>#}
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
在urls.py中我们有写过name=""这个地方,这里就是起别名,最终用到html这里很舒服,这是要修改的地方,这样的方法是很提高效率的
url命名空间:
在polls/urls.py中加入变量app_name='polls'
那么此时再对index.html文件中的那个超链接地址进行修改吧,指明,是polls的detail。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
{# <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>#}
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
</body>
</html>
from django.urls import path
from . import views app_name = 'polls'
urlpatterns = [
path('', views.index, name='index'),
# ex:/polls/5
path('<int:question_id>/', views.detail, name='detail'),
# ex:/polls/5/results
path('<int:question_id>/results/', views.results, name='results'),
# ex:/polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
# 添加新的单词'specifics'有了中介之后这里就是改了也无妨
path('specifics/<int:question_id>/', views.detail, name='detail'),
]
两点了睡了睡了
使用pycharm开发web——django2.1.5(四)视图和模板相关的更多相关文章
- 使用pycharm开发web——django2.1.5(二)创建一个app并做一些配置
这里我学习的呢是刘江老师的站,主要原因在于他这个版本新,还比较细节 网址先留一手,约等于在引用http://www.liujiangblog.com/ 开始正题: 1.在pycharm界面终端命令行里 ...
- 使用pycharm开发web——django2.1.5(一)入坑尝试第一步,基本搭建
首先,接触python的人应该都会用pip 来安装需要的包吧(------>>>>)默认 在运行中使用python -m django --version来检查自己的djang ...
- 使用pycharm开发web——django2.1.5(五)表单和通用视图
看了刘江老师教程这么多天,卧槽,我才发现他也曾跻身于行伍之间,interesting 刘老师这波讲解很到位,告诉你如何编写单例视图的时候忽然告诉你,其实不用这么麻烦,我们有通用视图,那些总是要做相似的 ...
- 使用pycharm开发web——django2.1.5(三)创建models并进入交互界面shell做一些简单操作
这里model可以认为是数据对象本身 相当于在写java代码时候model目录下创建的实体类,models.py 中可以包含多个实体类,感觉这个操作挺骚的 下面是polls app里面的models, ...
- ThinkPHP5.0框架开发--第9章 TP5.0视图和模板
ThinkPHP5.0框架开发--第9章 TP5.0视图和模板 第9章 TP5.0视图和模板 ===================================================== ...
- SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL
前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...
- spring boot + Thymeleaf开发web项目
"Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等.大多数情况下Web应用程序将使用 spring- ...
- Spring Boot入门(四):开发Web Api接口常用注解总结
本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...
- QGIS 3.14插件开发——Win10系统PyCharm开发环境搭建四步走
前言:最近实习要求做一个QGIS插件,网上关于QGIS 3.14插件开发环境搭建的文档不多,而且也不算太全面.正好实习的时候写了一个文档,在这里给大家分享一下. 因为是Word转的Markdown,可 ...
随机推荐
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest B、H
比赛链接https://www.jisuanke.com/contest/3098?view=challenges B题 拉格朗日插值 题意 T组输入.一个n次多项式 f(x) ,每项的系数不知道, ...
- Break Standard Weight (ZOJ 3706)
Problem The balance was the first mass measuring instrument invented. In its traditional form, it co ...
- error while loading shared libraries: libmysqlclient.so.20 问题小结
问题:安装完成sysbench之后,查看sysbench版本号时出现下面问题.这种报错很常见, [root@zero01 sysbench]# /usr/local/sysbench/bin/sysb ...
- 内存管理2-@class关键字
Review: 给对象发送消息,进行相应的计数器操作. Retain消息:使计数器+1,改方法返回对象本身 Release消息:使计数器-1(并不代表释放对象) retainCount消息:获得对象当 ...
- SpringMVC--DispatcherServlet
DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spri ...
- java并发编程--第一章并发编程的挑战
一.java并发编程的挑战 并发编程需要注意的问题: 并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行.若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战 ...
- Maven的安装和配置(Windows 10)
1. 官网下载Maven管理工具 官网:https://maven.apache.org/download.cgi 系统要求: JDK:Maven 3.3以上需要JDK 1.7以上版本支持 Memor ...
- Flutter点击两次返回键退出APP
在APP中一些页面为了防止用户操作失误点击到返回键导致退出APP,可以设置其一定时间内点击两次返回键才允许退出APP,完成这个功能可以通过WillPopScope和SystemNavigator.po ...
- ubuntu下如何安装hg(mercurial)?
答: sudo apt-get install mercurial
- C之堆栈
栈* 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 堆* 程序员自己申请* new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* java中自动回收,C中需 ...