django的视图和模板(三)

视图是Django应用程序中Web页面的“类型”,它通常提供特定的功能,并且有一个特定的模板。例如,在博客应用程序中,您可能有以下视图:

博客主页——显示最新的几个条目。

进入“细节”页面——一个条目的permalink页面。

基于年的归档页面——在给定的年份显示所有月份的条目。

基于月的归档页面——在给定的月份中显示所有的日期。

基于日的归档页面——显示给定日期的所有条目。

注释操作——处理将评论发送到给定条目。

在我们的 poll 应用程序中,我们将有以下四个视图:

Question “索引”页面——显示最新的几个问题。

Question “细节”页面——显示一个问题文本,没有结果,只有一个表单可以投票。

Question “结果”页面——显示一个特定问题的结果。

Vote action——在一个特定的问题上处理投票给特定的选择。

在Django中,web页面和其他内容由视图交付。每个视图都由一个简单的Python函数(或方法,在基于类的视图的情况下)表示。Django将通过检查所请求的URL(确切地说,是域名后面的URL的一部分)来选择一个视图。

写多个视图

1. 编辑: polls/views.py

2. 把这些新视图连接到 polls.urls 模块,通过添加以下path()调用

看一下你的浏览器,在“/poll/34/”。它会运行detail()方法,并显示您在URL中提供的任何ID。试试“/poll/34/results/”和“/poll/34/vote/”——这些将显示占位符结果和投票页面。

当有人从你的网站上请求一个页面——比如“/polls/34/”,Django会加载mysite.urls  Python模块,因为它是由 ROOT_URLCONF (ROOT_URLCONF ='dgtest.urls') 设置指向的。它找到了名为urlpatterns的变量,并按顺序遍历模式。在“'polls/'”中找到匹配后,它去掉了匹配的文本(“polls/”),并将剩下的文本——“34/” 发送到 “polls.urls”。用于进一步处理的url URLconf。在那里它与<int:问题id/'相匹配,导致对detail()视图的调用如下:

detail(request=<HttpRequest object >,question_id=34)

写一些实际做某事的视图

每个视图负责执行以下两件事之一:返回一个包含所请求页面的内容的 HttpResponse ,或者提出一个异常,如Http404。其余的由你决定。

All Django wants is that HttpResponse. Or an exception.

因为它很方便,所以让我们使用Django自己的数据库API,这里有一个index()视图,它显示了系统中最新的5个轮询问题,根据发布日期:

不过这里有一个问题:页面的设计在视图中是硬编码的。如果您想要改变页面的外观,您将不得不编辑这个Python代码。因此,让我们使用Django的模板系统来将设计从Python中分离出来,创建一个视图可以使用的模板

First, create a directory called templates in your polls directory. Django will look for templates in there.

您的项目的TEMPLATES设置描述了Django如何加载和呈现模板。默认设置文件配置一个DjangoTemplates后端,其APP_DIRS 选项被设置为True。按照惯例,DjangoTemplates在每个INSTALLED_APPS.中寻找一个“templates”子目录。

在刚刚创建的templates目录中,创建名为poll的另一本目录,并在其中创建名为index.html的文件。换句话说,您的模板应该是polls/templat/polls/index.html。由于appdirectory模板加载器是如何工作的,所以您可以在Django中引用这个模板,就像polls/index.html一样。

polls/templates/polls/index.html

Now let’s update our index view in polls/views.py to use the template:

polls/views.py

该代码加载名为polls/index的模板。html并传递一个上下文。上下文是将模板变量名映射到Python对象的字典。

通过将浏览器指向 “/polls/” 来加载页面,您应该会看到一个包含“What’s up”问题的列表,链接指向问题的详细页面。

A shortcut: render()

加载模板、填充上下文并返回一个带有渲染模板的结果的HttpResponse 对象是一个非常常见的习惯。Django提供了一个捷径。这是完整的index()视图,重写:

render()函数把request对象作为它的第一个参数,一个模板名作为第二个参数,而字典作为它的可选的第三个参数。它返回给定模板呈现的给定模板的一个HttpResponse 体对象

Raising a 404 error

Now, let’s tackle the question detail view – the page that displays the question text for a given poll. Here’s the view:

polls/views.py

The new concept here: The view raises the Http404 exception if a question with the requested ID doesn’t exist.

We’ll discuss what you could put in that polls/detail.html template a bit later, but if you’d like to quickly get the above example working, a file containing just:

polls/templates/polls/detail.html

A shortcut: get_object_or_404()

如果对象不存在,那么使用get()并提高Http404是一个非常常见的习惯。Django提供了一个捷径。这里的细节()看来,重写:

get_object_or_404() 函数接受Django模型作为它的第一个参数和任意数量的关键字参数,它传递给model的manager的get()函数。如果对象不存在,它就会提高Http404。

为什么我们要使用一个助手函数getobjector404()而不是在更高的级别上自动捕获objectnotexist异常,或者让模型API提高Http404而不是objectdo notexist?

因为这会将模型层与视图层耦合。Django最重要的设计目标之一就是保持松散耦合。在django中引入了一些控制耦合。快捷键模块。


使用模板系统

模板系统使用查找语法来访问可变属性。在这个问题的例子中。问题文本,首先Django对对象问题进行字典查找。如果失败了,它会尝试一个属性查找——在这种情况下是可行的。如果属性查找失败了,它将尝试一个列表索引查找。


在模板中删除硬编码的url

记住,当我们在投票/索引中写下一个问题的链接时。html模板,这个链接部分是硬编码的:

这种硬编码的、紧密耦合的方法的问题在于,在带有大量模板的项目上更改url变得很有挑战性。但是,因为您在polls.urls模块 中定义了path()函数中的name参数。您可以通过使用 {% url %} 模板标签来消除对URL配置中定义的特定URL路径的依赖:




命名空间网址名称

项目只有一个应用,即polls。在真正的Django项目中,可能有5个、10个、20个应用程序或更多。Django如何区分它们之间的URL名称?例如,polls应用程序有一个详细的视图,同样的项目也可以在同一个项目中使用。如何让Django知道在使用 { % url %} 模板标签时为url创建哪个应用程序视图?

Now change your polls/index.html template from:

to point at the namespaced detail view:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容