文档章节

django part3 ---views

terry_hding
 terry_hding
发布于 2015/07/11 23:49
字数 1001
阅读 24
收藏 0
在django里,写一个视图通常分三步走
1 写逻辑 views.py
2 写url,让客户可以在浏览器中访问
3 写 template 里面的html前端显示文件
let's begin

polls.views.py
from django.http import HttpResponse
def results(request, question_id):
    response = "you are looking at the results of question %s"
    return HttpResponse(response % question_id)            //在页面中返回response字符串,通过url传参question_id



polls.urls.py
from django.conf.urls import url

from polls import views

urlpatterns  = [
    url(r'^$', views.index, name = 'index'),
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),         //<question_id>是参数,这个参数允许为数字>    
]

全局urls.py

mysite.urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^polls/', include('polls.urls')),
] 

显然前端完全是由views.py进行编写,我们希望能够前端与后端分开,前端的人专攻html,css,后端的人负责逻辑,那要如何做呢,django提供了一个很好的函数 render_to_response
polls.views.py
from django.http import Http404
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)                            //根据外键来选择哪个question
    except Question.DoesNotExist:
        raise Http404("Question does not exist")                                   //django的错误提示也非常的友好
    #question = get_object_or_404(Question,pk=question_id)
    return render_to_response('polls/detail.html',{'question':question})           //前端显示polls/detail.html, 给前端传question变量


polls.template.polls.detail.html              //之所以把detail.html放在templates/polls/下面是因为怕有很多的应用有相同的html,会混淆
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>detail</title>
</head>
<body>
<h1>{{ question.question_text }}</h1>                     //question是views.detail.render_to_response传过来的
<ul>
    {% for choice in question.choice_set.all %}           //模板也很强大,可以做一定的逻辑
    <li>{{ choice.choice_text }}</li>                     //列出一个question包含的所有choice
    {% endfor %}
</ul>
</body>
</html>



可见django的错误提示也是非常的友好,更加强大的去修改detail方法
polls.views.py
from django.shortcuts import render, render_to_response,get_object_or_404
from django.http import Http404
def detail(request, question_id):
    question = get_object_or_404(Question,pk=question_id)             //如果pk=question_id有这个question则赋给question,否则提示404错误
    return render_to_response('polls/detail.html',{'question':question})
再来看 index方法
polls.views.py

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)                                         //返回最近的question
这样写完全是python的硬编码,如果有变化,改动就会相当麻烦,改写成这样:
polls.views.py

def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    return render_to_response('polls/index.html',{'latest_question_list':latest_question_list})
polls.templates.polls.index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
{% if latest_question_list %}                                                    //if 模板
    <ul>
        {% for question in latest_question_list %}                               // for 模板
        <li><a href="/polls/{{ question.id }}">{{ question.question_text }}</a></li>  //列出questoin并作一个link到polls/1/再调用detail方法
        {% endfor %}
    </ul>
{% else %}
    <p>No polls are avaliable.</p>
{% endif %}
</body>
</html> 
polls.urls.py
from django.conf.urls import url

from polls import views

urlpatterns  = [
    url(r'^$', views.index, name = 'index'),
    url(r'^(?P<question_id>[0-9]+)/$', 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'),
]
这样如果有变化,可以直接改index.html而不需要动views.py

在之前的index.html, 我们的超链接是一个url,如果改动这个url,那么相应的urls.py也需要相应的变动,django还提供了一个以url name的形式写在模板里的方法,这样,只要修改url,则会相应更改index.html里面掉用的方法,因为我们的超链接无非也是为了调用方法,而并不关心url是以怎样的形式存在,只要能调用到相应的方法就行
<li><a href="/polls/{{ question.id }}">{{ question.question_text }}</a></li>
<li><a href ="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
这样改写后更加明确,question.question_text link detail
这边还存在一个问题,一个project里有很多的app, 当不同的app里都有detail方法,如何区分呢
解决方法,给url 定义作用域
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^polls/', include('polls.urls',namespace="polls")),            //增加作用域为polls
]
<li><a href ="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>   //polls:detail方法,这样就不会弄错了
这一篇讨论了一些url, templates, views, 这些都是最基本的,django非常强大,如果深入的学习,会大大节约开发的成本和时间

© 著作权归作者所有

共有 人打赏支持
terry_hding
粉丝 37
博文 133
码字总数 139248
作品 0
杨浦
QA/测试工程师
私信 提问
urls.py中url匹配的方式

方式一: [root@iZ28cumdzmgZ muahao01]# vim urls.py from django.conf.urls import patterns, include, url from django.contrib import admin from blog.views import index urlpatterns ......

羡慕不来
2014/12/22
0
0
Django的url用法

版权声明:本文为博主原创文章,转载请注明出处 利用Django开发网站,可以设计出非常优美的url规则,如果url的匹配规则(包含正则表达式)组织得比较好,view的结构就会比较清晰,比较容易维...

天马行空的鱼
2016/04/18
23
0
Python全栈 Web(Django框架、概述、安装)

Django 框架 WEB 与 服务器 WEB : 表示用户可以浏览的网页内容(HTML,CSS,JS) 服务器 专门给用户提供服务的一台机器 1.硬件与软件 硬件范畴:一台机器 软件范畴:一个能够接受用户请求并给出响应...

巴黎香榭
2018/09/19
0
0
Django学习笔记(3)

Django是典型的MVC框架,它的View需要templates来支持。用一句话可以总结出Django开发: Getting data from the database according to a parameter passed in the URL, loading a template a......

兔之
2015/09/05
77
0
二、Django基础 1 课程介绍 2 基本流程 3 urls基本讲解及view视图

1 课程介绍 python 3.x django 1.11 2 基本流程 https://www.processon.com/view/5ac1e2c9e4b0cf24e963ecd1 李昂老师blog http://www.cnblogs.com/onda/p/7380850.html MVC和MTV模式 Django......

隐匿的蚂蚁
2018/12/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ vector和list的区别

1.vector数据结构 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造...

shzwork
今天
3
0
Spring之invokeBeanFactoryPostProcessors详解

Spring的refresh的invokeBeanFactoryPostProcessors,就是调用所有注册的、原始的BeanFactoryPostProcessor。 相关源码 public static void invokeBeanFactoryPostProcessors(Configu......

cregu
昨天
4
0
ibmcom/db2express-c_docker官方使用文档

(DEPRECIATED) Please check DB2 Developer-C Edition for the replacement. What is IBM DB2 Express-C ? ``IBM DB2 Express-C``` is the no-charge community edition of DB2 server, a si......

BG2KNT
昨天
3
0
Ubuntu 18.04.2 LTS nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic)

平台:Ubuntu 18.04.2 LTS nvidia-docker2 版本:2.0.3 错误描述:在安装nvidia-docker2的时候报dpkg依赖错误 nvidia-docker2 : 依赖: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) 先看一下依......

Pulsar-V
昨天
4
0
学习笔记1-goland结构体(struct)

写在前面:若有侵权,请发邮件by.su@qq.com告知。 转载者告知:如果本文被转载,但凡涉及到侵权相关事宜,转载者需负责。请知悉! 本文永久更新地址:https://my.oschina.net/bysu/blog/3036...

不最醉不龟归
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部