Django视图与模板(6)
前面记到数据库与模型(models)有联系,现在记录一下视图与模板,他们两个也有联系。
个人理解:视图就好像一个cpu,比较核心,就是用来处理问题的,又叫业务逻辑处理,他把处理完的结果插入到模板里面,最后将模板返回给前端,进行展示。模板就好比一篇完形填空,留一些空等着视图插入数据。
这里说明一下,django是根据url来选择视图的。(强大的url系统)
写视图如下:
def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)
这里有四个视图:视图就是python函数,最后需要返回一个响应包。每当我们写完一个视图都需要在urls.py里面告诉django有一个视图的存在。如下一样:
from django.urls import path from . import views urlpatterns = [ # ex: /polls/ path('', views.index, name='index'), # ex: /polls/5/ path('<int:question_id>/', views.detail, name='detail'), # ex: /polls/5/results/ path('<int:question_id>/results/', views.results, name='results'), # ex: /polls/5/vote/ path('<int:question_id>/vote/', views.vote, name='vote'), ]
写一个用来显示前5个投票的视图index:
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)
到这里就完成了视图的书写。但是有一点,就是我们返回到前端都是固定页面,那么我们想要一个比较花哨的页面,比如需要一些css修饰时,那怎么把我们的好看的页面显示在前端呢?这时就需要模板(Temples),模板就是用来放前端的页面的。
Templates(模板):用来放HTML页面的,模板有自己特殊的语言叫模板语言-----很简单的一种语言;模板是在视图里面的应用模板的。大概的流程:框架接收到请求,然后通过url系统将请求装发给相应的视图,视图再去加载相应的模板(如何加载相应的模板以及如何在模板里进行相应的数据替换的,后面再记录。。。),这里要说明一下,就是模板放在哪里?一般放在模板所属的app里面,在里面创建一个Templates文件夹(在Templates里面在创建一个以app名字命名的文件夹,之后才在里面存放模板问价,这样做是为了防止两个或多个不同的app有相同的模板问价,这样框架就可能不知道返回哪一个模板摁键了。)
现在在相应的地方创建好文件夹,创建一个index.html的文件,写入:
{% 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 %}
然后进入到相应的视图来引用该模板:
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))
以上是视图加载模板。context(上下文):是一个字典,用来插入模板里面的变量: 通过render方法插入。
render()函数:第一个参数:request,第二个参数是模板的位置(uel),第三个参数是上下文(context)。如下:
from django.shortcuts import render from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] context = {'latest_question_list': latest_question_list} return render(request, 'polls/index.html', context)
以上就是完整的模板,视图基本使用与原理。大概就是这些的了~~~~~~~~~~~~~~~~~~~~~~~
这里还有特别的说明: 就是有时候我们去发送一个请求时,在我们的服务器端没有这个相应的请求时,就会返回一个404的页面。也就是啥也没找到的时候,就返回这个模板。如下:
from django.http import Http404 from django.shortcuts import render from .models import Question # ... def detail(request, question_id): try: question = Question.objects.get(pk=question_id) except Question.DoesNotExist: raise Http404("Question does not exist") return render(request, 'polls/detail.html', {'question': question})
以上就差不多就是这些了~~~~~~~~完美 >_< !