实现视图视图是一个简单的 Python 方法,它接受一个请求对象,负责实现:任何业务逻辑(直接或间接)上下文字典,它包含模板数据使用一个
视图是一个简单的 Python 方法,它接受一个请求对象,负责实现:
在 Django 中,当一个 URL 被请求时,所调用的 Python 方法称为一个视图(view),这个视图所加载并呈现的页面称为模板(template)。由于这个原因,Django 小组将 Django 称为一个 MVT(model-view-template)框架。另一方面,TurboGears 把自己的方法称作控制器(controller),将所呈现的模板称为视图(view),因此缩写也是 MVC。其区别在于广义的语义,因为它们所实现的内容是相同的。
最简单的视图可能会返回一个使用字符串初始化过的 HttpResponse 对象。创建下面的方法,并生成一个 /jobs
HTTP 请求,以确保 urls.py 和 views.py 文件都已经正确设置。
1
2
3
4
|
from django.utils.httpwrappers import HttpResponse def index(request): return HttpResponse("Job Index View") |
下面的代码将获取最近的 10 个职位,并通过一个模板呈现出来,然后返回响应。没有 下一节 中的模板文件,这段代码就无法 正常工作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
from django.template import Context, loader from django.http import HttpResponse from jobs.models import Job from django.template import Context, loader from django.http import HttpResponse from jobs.models import Job def index(request): object_list = Job.objects.order_by('-pub_date')[:10] t = loader.get_template('jobs/job_list.html') c = Context({ 'object_list': object_list, }) return HttpResponse(t.render(c)) |
在上面的代码中,模板是由 jobs/job_list.html
字符串进行命名的。该模板是使用名为 object_list
的职位列表的上下文呈现的。所呈现的模板字符串随后被传递到 HTTPResponse 构造器中,后者通过这个框架被发送回请求客户机那里。
加载模板、创建内容以及返回新响应对象的步骤在下面都被 render_to_response
方法取代了。新增内容是详细视图方法使用了一个 get_object_or_404
方法,通过该方法使用所提供的参数获取一个 Job 对象。如果没有找到这个对象,就会触发 404 异常。这两个方法减少了很多 Web 应用程序中的样板代码。
1
2
3
4
5
6
7
8
9
10
11
12
|
from django.shortcuts import get_object_or_404, render_to_response from jobs.models import Job def index(request): object_list = Job.objects.order_by('-pub_date')[:10] return render_to_response('jobs/job_list.html', {'object_list': object_list}) def detail(request, object_id): job = get_object_or_404(Job, pk=object_id) return render_to_response('jobs/job_detail.html', {'object': job}) |
注意,detail
使用 object_id
作为一个参数。这是前面提到过的 jobs urls.py 文件中 /jobs/
URL 路径后面的数字。它以后会作为主键(pk)传递给 get_object_or_404
方法。
上面的视图仍然会失败,因为它们所加载和呈现的模板(jobs/job_list.html and jobs/job_detail.html)不存在。