4 Django应用 第3部分(视图部分)
接着昨天写的那篇笔记,今天继续学习DJango中的内容。这一章主要是介绍Django中的视图部分。
4.1视图理念
4.2编写第一个视图
4.3编写更多的视图
4.4给视图编写功能
4.5render()和404错误
4.6使用模版
4.7使用url命名空间
4.1视图理念
视图:视图(view)是Django应用中的一“类”网页,它通常使用一个特定的函数提供服务。
视图通过使用特殊的函数,传递网页页面和其他内容,同时,视图也对web请求进行回应。通过检查请求的url选择使用哪一个视图。
4.2编写第一个视图
first,
打开polls/views.py,开始编写视图函数
polls/views.py from django.http import HttpResponse def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
second,
要在polls目录下创建一个URLconf,创建url.py文件
目录:
polls/
__init__.py
admin.py
models.py
tests.py
urls.py
views.py
同时键入代码,使网址和视图函数连接起来
polls/urls.py from django.conf.urls import url from . import views urlpatterns = [
url(r'^$', views.index, name='index'),
]
third,
在polls/urls.py中键入URLconf, 使得url可以连接到polls.urls模块
mysite/urls.py from django.conf.urls import include, url
from django.contrib import admin urlpatterns = [
url(r'^polls/', include('polls.urls')),
url(r'^admin/', include(admin.site.urls)),
]
结果,
将Index视图关联成功,浏览http://localhost:8000/polls/,会出现在视图中定义的网页内容。
解释:url()参数:(regex,view,*kwagrs,*name)
regex:正则表达式的短格式,匹配满足字符串的网页
view:找到一个正则表达时,就会调用view作为视图函数
kwargs:任何关键字参数都可以以字典形式传递给目标视图,暂不用
name:给URL命名,可以通过名称来引用URL
4.3编写更多的视图
first,编写更多的视图函数
polls/views.py #。。。
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)
second,编写url()将函数和URL连接起来
polls/urls.py from django.conf.urls import url from . import views urlpatterns = [
# ex: /polls/
url(r'^$', views.index, name='index'),
# ex: /polls/5/
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), #?P<question_id> 定义一个名字,它将用于标识匹配的模式
# ex: /polls/5/results/
url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
# ex: /polls/5/vote/
url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]
打开浏览器,输入“/34/”它将运行detail()方法并显示你在URL中提供的ID。 再试一下“/polls/34/results/”和“/polls/34/vote/” —— 它们将显示出对应的结果界面和投票界面。
解释:
Django发现匹配到了正则表达式'^polls/'
然后,Django将去掉匹配到的文本("polls/")并将剩下的文本 —— "34/" —— 发送给‘polls.urls’ URLconf 做进一步处理,这时将匹配r'^(?P<question_id>[0-9]+)/$'并导致像下面这样调用detail()视图:
detail(request=<HttpRequest object>, question_id='34')
4.4给视图编写功能
first,视图从数据库中读取记录
polls/views.py from django.http import HttpResponse from .models import Question def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([p.question_text for p in latest_question_list])
return HttpResponse(output) # Leave the rest of the views (detail, results, vote) unchangedsecond,创建模版
这时,页面设计被硬编码在视图中,我们使用模版,使页面和视图分离出来
在polls目录下创建templates目录,然后在templates目录下,创建另外一个目录polls,最后在其中创建文件index.html。为了避免与其他应用模版重复。
模版位置:(polls/templates/polls/index.html)
放入模版文件
polls/templates/polls/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 %}更新视图
polls/views.py from django.http import HttpResponse
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)render()函数将请求对象作为它的第一个参数,模板的名字作为它的第二个参数,一个字典作为它可选的第三个参数。 它返回一个HttpResponse对象,含有用给定的context 渲染后的模板。
third,处理视图函数,引发一个404错误
polls/views.py
from django.shortcuts import get_object_or_404, render from .models import Question
# ...
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 {{ question }}解释:如果没有根据ID找到一个Question对象,就会引发404错误
4.5使用模版和url命名空间
浏览http://localhost:8000/polls/,会出现在视图中定义的网页内容。
更改页面,detail.html模版应该是这样子的
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>更改index.html,改变一部分硬编码
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>更改为
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>它的工作原理是在polls,urls模版中查找指定的URL,因为刚才给一个URL命名为
detail,所以可以直接调用。
还有一个问题。如果应用特别多,不同的应用可能拥有几个名为detail的视图。
这个时候,在主URLconf下添加命名空间,可以防止这个问题
首先修改urls.py
mysite/urls.py from django.conf.urls import include, url
from django.contrib import admin urlpatterns = [
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
]其次将
polls/templates/polls/index.html <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>修改为 【浏览http://localhost:8000/polls/,会出现在视图中定义的网页内容。】
polls/templates/polls/index.html <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
4 Django应用 第3部分(视图部分)的更多相关文章
- Django基础(路由、视图、模板)
目录导航 Django 路由控制 Django 视图层 Django 模版层 Django 路由控制 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用 ...
- Django - 将URL映射到视图
URLconf 就像是 Django 所支撑网站的目录.它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表.你就是以这种方式告诉 Django,对于这个 URL 调用这段代码, ...
- 第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性
Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...
- Django:学习笔记(9)——视图
Django:学习笔记(9)——视图 基础视图 基于函数的视图,我们需要在使用条件语句来判断请求类型,并分支处理.但是在基于类的视图中,我们可以在类中定义不同请求类型的方法来处理相对应的请求. 基于函 ...
- Django:学习笔记(8)——视图
Django:学习笔记(8)——视图
- 三 Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性
Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...
- Django REST framework 中的视图
1.Request REST framework传入视图的request对象不再是Django默认的Httprequest对象,而是DRF提供的扩展类的Request类的对象 常用属性 request ...
- DRF (Django REST framework) 中的视图类
视图说明 1. 两个基类 1)APIView rest_framework.views.APIView APIView是REST framework提供的所有视图的基类,继承自Django的View父 ...
- Django与drf 源码视图解析
0902自我总结 Django 与drf 源码视图解析 一.原生Django CBV 源码分析:View """ 1)as_view()是入口,得到view函数地址 2) ...
- Django 学习之Rest Framework 视图相关
drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django REST ...
随机推荐
- vim中的分屏操作
title: vim中的分屏操作 date: 2017-11-14 21:45:11 tags: vim categories: 开发工具 在命令行中: vim -On file1 file2 # O ...
- fcrackzip (zip密码破解工具)
现在做一个例子,首先生成一个带有密码的zip的包 zip -P hujhh test.zip test1.txt test2,txt 可以看到密码是5位的纯字母 现在就用我们的这个软件开始破解 fcr ...
- [openjudge-动态规划]滑雪
题目描述 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区 ...
- bzoj2880
打公式好麻烦 QAQ 为了节省时间去复习,原谅我引用一下别人的博客...http://blog.csdn.net/acdreamers/article/details/8542292 #include ...
- 0.3:Before We Start
文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 需要做的准备 首先肯定是需要安装Unity,我这里选择的版本是Unity ...
- Python 类的特性讲解
类的特性讲解 类的特性 #定义一个类, class是定义类的语法,Role是类名, (object)是新式类的写法,必须这样 写,以后再讲为什么 class Role(object): #初始化函数, ...
- json转数组
- (NSDictionary *)dataArrayFromJson { NSString *filePath = [[NSBundle mainBundle] pathForResource:@& ...
- 解决eclipse修改后台代码ctrl+s总是【自动重启服务器】问题
每次修改后台代码保存总是自启动服务很是耗时,以下设置可以解决你的烦恼: 双击你要设置的项目: 点击ok,最后ctrl+s一下就搞定了. 这时候你随便修改后台代码随便ctrl+s都不会重新启动服务器.b ...
- 利用jQuery实现用户名片小动画
我爱撸码,撸码使我感到快乐!大家好,我是Counter.下面给大家介绍利用jQuery实现的小动画,非常的简便,如果有原生js操作的话,那么就不止这么多行了.至于CSS,个人觉得,这边CSS布局也蛮重 ...
- JAVA中对字符串的常见处理函数汇总
字符串 看到字符串,想到字符串处理中,有 字符串的反转,初级面试中常用到 字符串分割成字符串组,初级面试中常用到 字符串中的替换,初级面试中常用到 字符串中的截取,初级面试中常用到 反转reverse ...