之前的列表输出太粗糙了,现在可以通过模版定义输出格式
模版路径设置
打开myproject/settings.py文件
模版设置项
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
BACKEND - 默认的模版引擎
DIRS - 模版加载位置,可以定义多个位置
APP_DIRS - 默认为True,表示可以在每个app中加载模版
创建模版目录
Step1: 在APP_DIRS=True
前提下,在polls
目录下创建templates/polls
目录
Step2: 在polls/templates/polls
下创建一个index.html
文件,作为index视图的模版文件
编辑index.html
<ul>
{% for question in question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
index.html包含了一些{% %}, {{ }}特殊符号,这些符号组成了模版语法,最终这些语句会被转换成Python语句
{% %} - 最终转换为对应的Python语句,比如 if, for语句
{{ }} - 输出语句,会将{{ var_obj }} 之间的 var_obj输出到页面
通过模版,可以实现更换版面只需要修改模版,而不用更改视图,实现数据逻辑与显示逻辑分离
修改视图函数
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from django.template import loader # 增加的
from .models import Question
from django.utils import timezone
def index(request):
questions = Question.objects.all()
# out_put = ""
# # for q in questions:
# # out_put += "%s - %s <br>" % (q.question_text, q.pub_date)
template = loader.get_template('polls/index.html') # 增加的
context = {
'question_list': questions,
}
return HttpResponse(template.render(context))
通过模版加载器loader
创建了template
模版对象
context是一个字典,提供给template.render,字典的key就是模版里面的变量, 字典的value就是变量值
现在可以刷新一下 http://127.0.0.1/polls/
render便捷方式
创建模版,然后进行模版输出是开发web经常性的操作,所以刚才的操作可以简化
def index(request):
questions = Question.objects.all()
context = {
'question_list': questions,
}
return render(request, "polls/index.html", context)
讨论区