django2.0入门教程第三节

继上篇django2.0入门教程第二节,介绍了对django2.0模型类models的操作,本篇主要讲视图views和模板template

django的视图用于处理url请求,并将响应的数据传递到模板,最终浏览器将模板数据进行渲染显示,用户就得到了想要的结果

作为一个简易的投票系统, 除了index(主页), 还需要detail(详情页), results(结果页), vote(投票页) 这些视图。

增加视图:polls/views.py

#_*_coding:utf8_*_
from django.shortcuts import HttpResponse
def index(request):
    return HttpResponse("你好,欢迎来到投票系统的主页")

def detail(request, question_id):
    return HttpResponse('你正在查看问题%s' % question_id)

def results(request, question_id):
    response = '你正在查看问题%s的结果'
    return HttpResponse(response % question_id)

def vote(request, question_id):
    return HttpResponse('你正在给问题%s投票' % question_id)

配置url:polls/urls.py

#_*_coding:utf8_*_
from django.urls import path
from . import views
urlpatterns = [
    # /polls/
    path('', views.index, name='index'),
    # /polls/1/
    path('<int:question_id>/', views.detail, name='detail'),
    # /polls/1/results/
    path('<int:question_id>/results/', views.results, name='results'),
    # /polls/1/vote/
    path('<int:question_id>/vote/', views.vote, name='vote'),
]

url访问:

http://127.0.0.1:8000/polls/

你好,欢迎来到投票系统的主页

http://127.0.0.1:8000/polls/1/

你正在查看问题1

http://127.0.0.1:8000/polls/1/results/

你正在查看问题1的结果

http://127.0.0.1:8000/polls/1/vote/

你正在给问题1投票

这样的视图内容过于简略粗糙, 在后台添加多一些数据,供后续调用:

threequestion.png

通过视图直接返回的数据,显示格式很单一,要想显示丰富的数据形式,就需要引用模板,用独立的模板文件来呈现内容。

新增模板: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>问题为空</p>
{% endif %}

修改视图: polls/views.py 传递变量给模板

#_*_coding:utf8_*_
from django.shortcuts 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))

访问:http://127.0.0.1:8000/polls/

index.png

使用便捷写法--render()函数:

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()即可,尽可能精简代码

详情页的展示:

polls/views.py

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('问题不存在')
    return render(request, 'polls/detail.html', {'question': question})

新增详情页:polls/templates/polls/detail.html

{{ question }}

http://127.0.0.1:8000/polls/3/

问题3

访问不存在的问题id时,会报404

http://127.0.0.1:8000/polls/4/

404.png

404页面抛出的便捷写法:get_object_or_404()

polls/views.py

from django.shortcuts import render, get_object_or_404
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})

详情页输出关联数据表:

<h1>{{ question.question_text }}</h1>
<ul>
    {% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
    {% endfor %}
</ul>

将问题下有关联选项一并输出:

foreign.png

去掉url的硬编码格式

原本index.html的url定义形式是这样的:

<li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>

这种写法属于硬编码方式,并不好,因为一旦详情页的url改变,就要去改变相应的html文件,如果html文件有很多处都引用了,逐一排查需要耗费相当多时间。将url改成以下形式即可实现自动转换:

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

修改url配置:

将polls/urls.py的详情页url由:path('<int:question_id>/', views.detail, name='detail')改为:path('specifics/<int:question_id>/', views.detail, name='detail')

此时,index.html的url会自动由 http://127.0.0.1:8000/polls/1/ 转为 http://127.0.0.1:8000/polls/specifics/1/

url的命名空间

现实项目中,一个django项目是会有多个应用的,为了将这些应用进行区分,需要使用命名空间

#_*_coding:utf8_*_
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
    path('', views.index, name='index'),
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/results/', views.results, name='results'),
    path('<int:question_id>/vote/', views.vote, name='vote'),
]

将index.html的url生成代码加上命名空间:

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

源码下载

相关源码包

如果对django2.0教程感兴趣,请关注我的简书,持续更新中...

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏lgp20151222

Java规则引擎drools:drt动态生成规则并附上具体项目逻辑

由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面。

31820
来自专栏微信公众号:Java团长

Java后端程序员1年工作经验总结

  毕业已经一年有余,这一年里特别感谢技术管理人员的器重,以及同事的帮忙,学到了不少东西。这一年里走过一些弯路,也碰到一些难题,也受到过做为一名开发却经常为系统...

31820
来自专栏魏琼东

一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-UDA应用中使用IOC解偶数据连接环境

前文回顾          前面的三篇文章,我把AgileEAS.NET平台的UDA的应用案例从数据处理方式与流程、基础的语句执行、查询处理以及引入的委托处理机...

20190
来自专栏Linyb极客之路

2016年百度面试经历

第一轮面试 1. 简单介绍自己 这个没什么说的,主要都是从简历上面说一下,面试官也会根据简历进行提问 2. 想象一个场景:一个系统要同步美国(订单)和中国的数据...

33570
来自专栏依乐祝

.NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

为什么写这篇文章呢?因为.NET Core的生态越来越好了!之前玩转.net的时候操作Redis相信大伙都使用过一些组件,但都有一些缺点,如ServiceSta...

16820
来自专栏星回的实验室

golang建立MongoDB连接池

最近用go语言重构之前用python草草搭建的推荐引擎,语言杂食确实很难受,不过不得不说,在饱受弱类型脚本语言的摧残之后重新用回强类型语言,轻微强迫症的我居然还...

29850
来自专栏腾讯移动品质中心TMQ的专栏

测试人员代码分析5步法

前言 随着测试行业的发展,测试攻城狮也越来越关注产品的源码了。在很多团队中,读懂代码的实现是做好测试的重要一步,但是读懂代码这件事非常依赖代码能力,没有什么捷径...

304100
来自专栏王磊的博客

Visual Studio 2010 中JS注释制作

  Visual Studio 2010中的js注释已经很强大了,但怎么才能和调用c#的方法一样容易呢?怎样才能让每个参数都有注释说明呢?底下就是想要的答案。 ...

37890
来自专栏依乐祝

Redis基本使用及百亿数据量中的使用技巧分享

熟悉的开场白,大家晚上好啊,今天给大家分享的是Redis在大数据中的使用,可能真正讲的是一些redis的使用技巧,Redis基本的一些东西。

26800
来自专栏逸鹏说道

MVC视图展现模式之移动布局解析-续集

网站就必须用响应式布局吗?MVC视图展现模式之移动布局:http://www.cnblogs.com/dunitian/p/5213787.html 有人会疑问...

27680

扫码关注云+社区

领取腾讯云代金券