View 视图
通过Python函数(或一个类的方法)来生成一个页面;可能会涉及通过Database API访问数据库;通过模板渲染页面;处理请求中的GET,POST;
视图最终将返回:HttpResponse 或 异常 (Http404)
创建视图
视图 Index
# polls/views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Question
def index(request):
lastest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'lastest_question_list': lastest_question_list}
return render(request, 'polls/index.html', context)
# 复杂的实现
# 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))
创建模板
# polls/templates/polls/index.html
{% if lastest_question_list %}
<ul>
{% for question in lastest_question_list %}
<li>
<a href="{{ question.id }}">{{ question.question_text }}</a>
</li>
{% endfor %}
{% else %}
<p>No Question!</p>
{% endif %}
模板的路径为
polls/templates/polls/index.html
,第二个/polls
为模板创建命名空间;
settings.py
中APP_DIR: True
Django 会在APP目录下寻找模板
视图 detail
# polls/views.py
def detail(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/detail.html', {'question': question})
# polls/templates/polls/detail.html
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
django.shortcuts:Django 的设计原则就是要让各部分松耦合,每部分只做好其工作
get()
--get_object_or_404()
filter()
--get_list_or_404()