刘老师说这块很重要。。。。。

应该是很重要,大概看了一下,这里面关于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(四)视图和模板相关的更多相关文章

  1. 使用pycharm开发web——django2.1.5(二)创建一个app并做一些配置

    这里我学习的呢是刘江老师的站,主要原因在于他这个版本新,还比较细节 网址先留一手,约等于在引用http://www.liujiangblog.com/ 开始正题: 1.在pycharm界面终端命令行里 ...

  2. 使用pycharm开发web——django2.1.5(一)入坑尝试第一步,基本搭建

    首先,接触python的人应该都会用pip 来安装需要的包吧(------>>>>)默认 在运行中使用python -m django --version来检查自己的djang ...

  3. 使用pycharm开发web——django2.1.5(五)表单和通用视图

    看了刘江老师教程这么多天,卧槽,我才发现他也曾跻身于行伍之间,interesting 刘老师这波讲解很到位,告诉你如何编写单例视图的时候忽然告诉你,其实不用这么麻烦,我们有通用视图,那些总是要做相似的 ...

  4. 使用pycharm开发web——django2.1.5(三)创建models并进入交互界面shell做一些简单操作

    这里model可以认为是数据对象本身 相当于在写java代码时候model目录下创建的实体类,models.py 中可以包含多个实体类,感觉这个操作挺骚的 下面是polls app里面的models, ...

  5. ThinkPHP5.0框架开发--第9章 TP5.0视图和模板

    ThinkPHP5.0框架开发--第9章 TP5.0视图和模板 第9章 TP5.0视图和模板 ===================================================== ...

  6. SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL

    前言 通过前面的MyBatis部分学习,已经可以使用MyBatis独立构建一个数据库程序,基本的增删查改/关联查询等等都可以实现了.简单的单表操作和关联查询在实际开的业务流程中一定会有,但是可能只会占 ...

  7. spring boot + Thymeleaf开发web项目

    "Spring boot非常适合Web应用程序开发.您可以轻松创建自包含的HTTP应用.web服务器采用嵌入式Tomcat,或者Jetty等.大多数情况下Web应用程序将使用 spring- ...

  8. Spring Boot入门(四):开发Web Api接口常用注解总结

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 在程序员的日常工作中,Web开发应该是占比很重的一部分,至少我工作以来,开发的系统基本都是Web端访问的 ...

  9. QGIS 3.14插件开发——Win10系统PyCharm开发环境搭建四步走

    前言:最近实习要求做一个QGIS插件,网上关于QGIS 3.14插件开发环境搭建的文档不多,而且也不算太全面.正好实习的时候写了一个文档,在这里给大家分享一下. 因为是Word转的Markdown,可 ...

随机推荐

  1. 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) ,每项的系数不知道, ...

  2. Break Standard Weight (ZOJ 3706)

    Problem The balance was the first mass measuring instrument invented. In its traditional form, it co ...

  3. error while loading shared libraries: libmysqlclient.so.20 问题小结

    问题:安装完成sysbench之后,查看sysbench版本号时出现下面问题.这种报错很常见, [root@zero01 sysbench]# /usr/local/sysbench/bin/sysb ...

  4. 内存管理2-@class关键字

    Review: 给对象发送消息,进行相应的计数器操作. Retain消息:使计数器+1,改方法返回对象本身 Release消息:使计数器-1(并不代表释放对象) retainCount消息:获得对象当 ...

  5. SpringMVC--DispatcherServlet

    DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spri ...

  6. java并发编程--第一章并发编程的挑战

    一.java并发编程的挑战 并发编程需要注意的问题: 并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行.若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战 ...

  7. Maven的安装和配置(Windows 10)

    1. 官网下载Maven管理工具 官网:https://maven.apache.org/download.cgi 系统要求: JDK:Maven 3.3以上需要JDK 1.7以上版本支持 Memor ...

  8. Flutter点击两次返回键退出APP

    在APP中一些页面为了防止用户操作失误点击到返回键导致退出APP,可以设置其一定时间内点击两次返回键才允许退出APP,完成这个功能可以通过WillPopScope和SystemNavigator.po ...

  9. ubuntu下如何安装hg(mercurial)?

    答:  sudo apt-get install mercurial

  10. C之堆栈

    栈* 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 堆* 程序员自己申请* new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* java中自动回收,C中需 ...