VIEW 视图与templates 模板
view视图是Django的一个很重要的功能,它通常提供一个特定的函数以及并且还拥有一个特定的模板来动态生成网页。在之前我们也使用过Django的视图功能,就是在views.py文件中加入了一个函数,之后通过URLconfs将这个函数与一个URL绑定。我们访问对应的URL就能在页面上看到函数的返回值了,可以说是views.py文件中存放的就是网页的后端逻辑。
之前我们的后端就是直挺挺的将返回值放在了游览器页面上,这种做法很不美观,同时如果想要调整显示的布局还需要修改后端代码。为了解决这个问题Django为我们提供了templates 模板。其实templates就是一段HTML代码,它的作用就是为后端传回来的数据提供一个放置数据的模板,将后端的数据放到对应的位置上显示出来,就不用后端关心前端的布局了。
我们可以在polls应用里面创建templates文件夹,在里面创建我们的模板文间,Django会自己在其中找对应的文件,也可以在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',
],
},
},
]
在DIRS中写入自己要存放模板文件的文件夹,但是这样做不符合Django应用即插即用的理念,所以我还是在应用中创建templates文件夹。但这时候我们还要思考一个问题:当两个应有中模板文件的名称一样的时候如何进行区分?,解决方法就是在templates文件夹中再创建一个polls文件夹,这样就能将polls应用的模板文件与其他应用的模板文件区分开了。我们在polls文件夹中创建index.html文件,并写入如下代码
<a>Have {{count}} questions:</a>
{% if question_list %}
<ol>
{% for question in question_list %}
<li><a>{{ question.question_text }}</a></li>
<ul>
{% for choice in question.choice_set.all %}
<li><input type="checkbox">{{ choice.choice_text }}</input></li>
{% endfor %}
</ul>
{% endfor %}
</ol>
{% else %}
<p>No polls are available.</p>
{% endif %}
在上面的代码中我们可以看到有很多被{}包裹住的代码,这些代码就是将后端传回来的数据,填充到这个模板对应位置的代码。其中的语法格式与python中的语法格式基本一致,要注意的是if与for要有endif与endfor相对应,数据的名称与后台传回的数据名称相对应。
我们首先在数据库中创建一个问题:what is django,之后再为这个问题添加两个回答:is language ,is a farmework。之后在views.py中添加如下代码
from django.shortcuts import render
from .models import Question
def index(request):
question_list=Question.objects.all()
count=len(question_list)
context = {'question_list':question_list,'count':count}
return render(request,'polls/index.html',context)
这段代码的大致思想就是使用Django自带的数据库操作方式,将question表中的数据全部取出来,之后通过render函数返回一个包含 填充完数据的模板的HttpResponse,之后在polls的urls.py中为index函数绑定一个url就完成了,效果图如下: