每个视图必须要做的只有两件事:返回一个包含被请求页面内容的 HttpResponse
对象,或者抛出一个异常,比如 Http404
。
你的视图可以从数据库里读取记录,可以使用一个模板引擎(比如 Django 自带的,或者其他第三方的),可以生成一个 PDF 文件,可以输出一个 XML,创建一个 ZIP 文件,你可以做任何你想做的事,使用任何你想用的 Python 库。
Django 只要求返回的是一个 HttpResponse
,或者抛出一个异常。
因为 Django 自带的数据库 API 很方便,我们试试在视图里使用它。我们在 index() 函数里插入了一些新内容,让它能展示数据库里以发布日期排序的最近 5 个投票问题,以空格分割:
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)
# Leave the rest of the views (detail, results, vote) unchanged
这里有个问题:页面的设计写死在视图函数的代码里的。如果你想改变页面的样子,你需要编辑 Python 代码。所以让我们使用 Django 的模板系统,只要创建一个视图,就可以将页面的设计从代码中分离出来。
首先,在你的 polls
目录里创建一个 templates
目录。Django 将会在这个目录里查找模板文件。
你项目的 TEMPLATES
配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates
后端,并将 APP_DIRS
设置成了 True。这一选项将会让 DjangoTemplates
在每个 INSTALLED_APPS
文件夹中寻找 "templates" 子目录。这就是为什么尽管我们没有像在第二部分中那样修改 DIRS 设置,Django 也能正确找到 polls 的模板位置的原因。
在你刚刚创建的 templates
目录里,再创建一个目录 polls
,然后在其中新建一个文件 index.html
。换句话说,你的模板文件的路径应该是 polls/templates/polls/index.html
。因为``app_directories`` 模板加载器是通过上述描述的方法运行的,所以 Django 可以引用到 polls/index.html
这一模板了。
注意:
虽然我们现在可以将模板文件直接放在 polls/templates
文件夹中(而不是再建立一个 polls 子文件夹),但是这样做不太好。Django 将会选择第一个匹配的模板文件,如果你有一个模板文件正好和另一个应用中的某个模板文件重名,Django 没有办法区分它们。我们需要帮助 Django 选择正确的模板,最好的方法就是把他们放入各自的 命名空间 中,也就是把这些模板放入一个和 自身 应用重名的子文件夹里。
将下面的代码输入到刚刚创建的模板文件中:
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
然后,让我们更新一下 polls/views.py
里的 index
视图来使用模板:
from django.http import HttpResponse
from django.template import loader
from .models import Question
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))
Web 应用的常见任务是根据用户输入查出数据库中的数据。在一个简单例子中,会是通过分类筛选一个对象列表。一个更复杂的用例可能...
WebSecurity 属性 - HasUserIdWebSecurity 对象定义 HasUserId 属性是一个布尔值,指示当前用户在 WebSecurity 数据库中是否具有...
WebSecurity - RequireAuthenticatedUser()WebSecurity 对象定义 如果当前用户未通过身份验证,RequireAuthenticatedUser() 方法...
ASP.NET Calendar OtherMonthDayStyle 属性 Calendar 控件定义和用法 OtherMonthDayStyle 属性用于设置或返回日历中不属于当前月...