frist Django app — 三、 View

前面已经说过了Django中model的一些用法,包括orm,以及操作的api,接下来就是搭一些简单的界面学习view——Django中的view。主要介绍以下两个方面:

  • url映射
  • 请求处理
  • 模板文件

url映射和请求处理共同构成了MVC中的C——controller,这里面涉及了url的写法(主要是正则表达式),接收页面传递过来的参数。在Django中可以使用template来进行页面渲染,这样可以直接使用传递过来的数据。

url映射

这里紧接着上一篇的工程完善polls项目,polls网站首页显示最近的问题列表,还可以查看某一个问题的详情,可以进一步查看调查问题的结果。进行投票

  • index:显示最近的问题列表
  • detail:查看调查问题详细信息
  • result:显示某一个问题的结果
  • vote:对问题某一个答案进行投票

以上的四个功能我们分别用四个页面,编辑polls/urls,py

from django.conf.urls import url
from . import views

app_name = ‘polls‘
urlpatterns = [
    url(r‘^$‘, views.index, name = ‘index‘),
    url(r‘^(?P<question_id>[0-9]+)/detail/$‘, views.detail, name = ‘detail‘),
    url(r‘^(?P<question_id>[0-9]+)/results/$‘, views.results, name = ‘results‘),
    url(r‘^(?P<question_id>[0-9]+)/vote/$‘, views.vote, name = ‘vote‘),
]

name:url规则的名称,可在模板中引用

app_name:定义url的命名空间,命名空间的作用就是防止name重名

请求处理

编辑polls/views.py

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, Http404
from models import Question

# Create your views here.
def index(request):   # 查询最新的五条Question,- 表示降序排列
    latest_question_list = Question.objects.order_by(‘-publ_date‘)[:5]
    context = {‘latest_question_list‘: latest_question_list}
    return render(request, ‘polls/index.html‘, context)

def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, ‘polls/detail.html‘, {‘question‘: question})

def results(request, question_id):
    return HttpResponse("result:question id is %s" % question_id)

def vote(request, question_id):
    return HttpResponse("vote:question id is %s" % question_id)

views.py处理通过urls.py分发过来的请求,比如上面最后一个vote中,很简单直接返回一个HttpResponse对象,其实所有的views处理都是返回该HttpResponse对象,包括使用能够render方法的时候

  • 直接返回HttpResonse
  • 通过调用render,将数据渲染到templates再返回HttpResponse

get_object_or_404:获取一个Question对象,如果没有就抛出Http404 Exception,这是经过优化后的代码,本来是自己手动查找一个对象,自己判断对象是否存在,不存在再raise Exception,改进之后降低了model和view之间的耦合,这样view不再依赖model层的具体实现,达到解耦的目的。

模板文件

在mysite/polls下新建两级目录mysite/polls/templates/polls,templates是固定的,polls是APP名称,然后在mysite/polls/templates/polls目录下新建一个index.html文件——也就是模板文件

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="{% url ‘polls.detail‘ question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

这里有几点先说明一下:

templates/polls目录

在settings.py里面有关于templates的配置

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:后端用的模板引擎django.template.backends.django.DjangoTemplates

DIRS:模板的位置也就是说不一定要放在约定的目录里面,但是建议最好放在每个APP名称的目录下,避免多个APP的情况下有模板名称相同的时候Django分不清

APP_DIRS:为true的时候DjangoTemplates会搜索app所在目录下的模板即polls/templates/polls

所以上面我们放在了默认目录

template语法

在Djang的模板里面包含普通的html代码和模板代码,比如if-else,for,dotted语法(访问数据)等。这里先介绍一些基本的,关于html不多说。

  • 模板代码使用普通{%%}包围,还有比如{%url%}语法
  • {{模板中的数据}}
  • {%if %} {%else %} {%endif %}
  • {%for %} {%endfor%}
  • latest_question_list为views.py传递过来的参数,可以使用点语法访问数据,支持的数据格式有值传递和引用(包括:list,dic,tuple,对象属性,对象方法(没有其他参数,必须有返回值)),使用点语法的时候Django搜索参数的顺序是:字典,对象属性,对象方法,list

url命名空间

<li><a href="{% url ‘polls.detail‘ question.id %}">{{ question.question_text }}</a></li>

在urls.py文件中通过申明一个全局变量app_name就是url的命名空间,在{%url %}语法中就可以使用app_name+name 的方式引用url,比如‘polls.detail’说明使用哪一个url匹配,question_id为传递给url匹配的参数

总结

除了学习Django的基本知识,还学习(膜拜)了Django的精巧设计,松耦合

  • Django对获取单个对象的时候Http404异常做了封装,解耦model和view
  • 使用{%url %}语法不需要将url硬编码在template文件中,达到和url映射解耦的目的


完整代码

http://pan.baidu.com/s/1kUFv5lH

时间: 2024-08-05 01:54:55

frist Django app — 三、 View的相关文章

frist Django app — 四、 完善View

上一篇已经完成了polls的基本功能,接下来完善剩下的vote功能和并使用generic views改进请求处理view.包含表单的简单运用和前后台参数传递. 目录 vote:完善投票功能 generic views:改进views.py vote 编辑detail.html,添加投票投票功能 <h1>{{question.question_text}}</h1> {% if error_message %}<p><strong>{{ error_messa

frist Django app — 五、Test

Test——很重要但是没有被重视起来的一个环节,至少是我自己,其实自己之前在做java web的时候就去尝试过怎么做REST接口的测试,一直没有找到一种合适方式,而且因为时间紧没有进一步深究,但是造成的后果每次做了修改之后都测试不充分,引起新的问题,所以这次对于python正好看看Django的单元测试. 用的是单独的数据库,数据库是干净的(暂未有数据库,test所有操作都是从零开始),不会对正式的数据库造成影响 Test Model 到现在我们主要的业务逻辑代码在model和view里面,所以

frist Django app — 一、 创建工程

缘起 既然python都学了,学习python的时候感觉是相见恨晚,一种新的编程语言带给我一种新的思考问题的方式,为了巩固学过的东西并进一步学习python,就想学学Django,看看会不会带给我关于web新的东西.把自己学习过程记录在这里,发现每次写博客都是对学习过的东西的一次整理和提升. 新建一个project startproject python和Django的安装不再详述,我的环境python2.7,Django1.9.7 . django-admin startproject mys

frist Django app— 二、 Model和管理界面

Django是符合MVC架构的,这里现学习M—Model,而且Django自带了一个管理model(数据库)的界面,所以一并学习. Database 配置 编辑Django的配置文件settings.py进行配置 添加polls app,修改后如下 INSTALLED_APPS = [ 'django.contrib.admin', # 管理界面 'django.contrib.auth', # 认证系统 'django.contrib.contenttypes', # 框架的content t

django (三) 第一个django app 创建model

经过上一章,我们已经创建好一个django app了,接下来,我们开始完善它. 首先,我们先了解些基本概念. Django中创建的每个应用程序都是由Python的包组成,遵循某些约定.Django配有一个实用程序,自动生成一个应用程序的基本目录结构,所以您可以专注于编写代码,而不是创建目录. 那么项目和应用程序到底有什么区别呢? 一个app是一个web应用:比如一个博客系统,一个简单的投票系统.而一个项目是一个集合的配置和应用程序特定的Web站点.一个项目可以包含多个应用程序.应用程序可以存在于

Django框架 之 view视图

浏览目录 概述 简单的视图 HttpRequest对象 CBV和FBV 给视图加装饰器 Request对象 Response对象 JsonResponse对象 Django shortcut functions 一.概述 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项

python3开发进阶-Django视图(View)的常见用法

阅读目录 简述Django的View(视图) CBV和FBV Request对象和Response对象 Django组件(render,redirect)详解 一.简述Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项目目录下面. 除此之外

Django基础三之视图函数

Django基础三之视图函数 本节目录 一 Django的视图函数view 二 CBV和FBV 三 使用Mixin 四 给视图加装饰器 五 Request对象 六 Response对象 一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项

03.Django基础三之视图函数

一 Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. 无论视图本身包含什么逻辑,都要返回响应.代码写在哪里也无所谓,只要它在你当前项目目录下面.除此之外没有更多的要求了--可以说"没有什么神奇的地方".为了将代码放在某处,大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为view