django的视图和模板(三)

目录

写多个视图

写一些实际做某事的视图

A shortcut: render()

Raising a 404 error

A shortcut: get_object_or_404()

使用模板系统

在模板中删除硬编码的url

命名空间网址名称


视图是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中分离出来,创建一个视图可以使用的模板

1. 首先创建 templatespolls 目录.

您的项目的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

2. 更新 view.py中index方法  polls/views.py 

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创建哪个应用程序视图?

改变 polls/index.html :

要指出名称空间的细节视图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值