Django tutorial part3

writing_first_django_app_part3

在Django中,网页和其他内容都是通过views来呈现的,每个view由一个简单的python函数来表示,django通过检查url来选择一个view

URL pattern: URL的简单通用形式, eg: /newsarchive/<year>/<month>/

python用‘URLconfs‘来将URL patterns匹配到views

先看一个简单view的例子

# polls/view.py

from django.http import HttpResponse

def index(request):
    return HttpResponse("hello, world. you‘re at the polls index.")

我们需要将它映射到一个URL才能访问到它,这里我们需要一个URLconf 要在polls的目录下创建一个URLconf,首先要创建一个文件urls.py,加入代码:

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns(‘‘,
        url(r‘^$‘, views.index, name = ‘index‘),
        )

下一步要在根URLconf中插入这个新建的URLconf

# mysite/urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(‘‘,
    # Examples:
    # url(r‘^$‘, ‘mysite.views.home‘, name=‘home‘),
    # url(r‘^blog/‘, include(‘blog.urls‘)),

    url(r‘^polls/‘, include(‘polls.urls‘)),
    url(r‘^admin/‘, include(admin.site.urls)),
)

修改之后重启服务器,访问localhost:8000/polls/就可以看到hello world的界面. 刚才添加一个view的流程就是先在poll/views.py添加新的view,然后在polls/urls.py创建一个新的URLconf,最后在根的mysite/urls.py中把它include进去

现在再添加多几个views

# polls/views.py

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def index(request):
    return HttpResponse("hello, world. You‘re at the polls index.")

def detial(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)
# polls/urls.py

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns(‘‘,
        # /polls/
        url(r‘^$‘, views.index, name = ‘index‘),
        # eg: /polls/5/
        url(r‘^(?P<question_id>\d+)/$‘, views.detail, name = ‘detail‘),
        # eg: /polls/5/results/
        url(r‘^(?P<question_id>\d+)/results/$‘, views.results, name = ‘result‘),
        # eg: /polls/5/vote/
        url(r‘^(?P<question_id>\d+)/vote/$‘, views.vote, name = ‘vote‘),

        )

因为前面已经在根目录的urls.py中添加polls的URLconf,所以不用再次添加 (?P<question_id>\d+)表示提取匹配\d+的内容,然后赋值到关键字question_id中作为参数传入到类里面去处理

每个view都会有两种功能中的其中一种,返回一个HttpResponse或者Http404.

现在我们尝试给view添加真正的功能,在index界面展示最新的5个poll questions,根据时间排序:

# polls/views.py

from django.http import HttpResponse

from polls.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) unchanged

我们希望用自己的模板来显示Question列表,在polls目录创建目录templates,并在里面创建目录polls,在里面建立文件index.html:

# mysite/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 %}

这里把每个Question当作一个链接来展示,

然后修改view的代码来使用这个模板:

# polls/views.py

from django.http import HttpResponse
from django.template import RequestContext, loader

from polls.models import Question

def index(request):
    latest_question_list = Question.objects.order_by(‘-pub_date‘)[:5]
    template = loader.get_template(‘polls/index.html‘)
    context = RequestContext(request, {
        ‘latest_question_list‘: latest_question_list,
    })
    return HttpResponse(template.render(context))

上面使用了template.loader来调用模板,然后创建一个RequestContext对象来发出请求,经过模板渲染后返回HttpResponse对象

render()函数

第一个参数是request对象,第二个参数是模板名字,第三个参数可以选择一个字典,用来传递一些关键字参数.返回一个将请求内容渲染过后的HttpResponse对象

Raising a 404 error
# polls/views.py

from django.http import Http404
from django.shortcuts import render

from polls.models import Question
# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, ‘polls/detail.html‘, {‘question‘: question})

暂时性的detail.html:

# polls/templates/polls/detail.html

{{ question }}

上面代码在找不到这个Question对象的时候会返回404错误 也可以用get_object_or_404()函数来一次性处理

from django.shortcuts import get_object_or_404, render

from polls.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})

这样可以直接在获取对象的时候检验是否成功,否则就返回错误

Use the templates system
# 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>

模板系统可以通过‘.‘来访问变量的属性,如question.question_text

Namespacing URL names

目前只有一个应用的时候,URL的名字不会发生冲突,但是如果应用数量增加到多个,可能有一个应用有相同的URL名字,这时候可以通过加上作用域来解决:

# mysite/urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns(‘‘,
    url(r‘^polls/‘, include(‘polls.urls‘, namespace="polls")),
    url(r‘^admin/‘, include(admin.site.urls)),
)

现在将polls/templates/polls/index.html改为:

<li><a href="{% url ‘polls:detail‘ question.id %}">{{ question.question_text }}</a></li>
时间: 2024-08-09 04:07:02

Django tutorial part3的相关文章

Django Tutorial 学习笔记

实际操作了Django入门教程中的范例,对一些细节有了更清晰的掌握.感觉只看文档不动手是不行的,只看文档没法真正掌握其中要素之间的关系,看了很多遍也不行,必须动手做了才能掌握.同时,这次练习在Eclipse+PyDev环境下进行,了解了这个开发环境对Django的支持情况. Django网站提供的入门教程: https://docs.djangoproject.com/en/1.6/intro/tutorial01/ 教程中的数据库结构 Poll {question, pub_date} Cho

django入门-part3

完全翻译自官方文档 https://docs.djangoproject.com/en/1.10/intro/tutorial03/ 本节讲视图 我们设计一个简单投票页面,它有如下3个功能 1. 显示要投票的问题 2. 点击"投票"按钮提交你的选项 3. 展示这个投票的结果 polls/views.py 代码如下: def detail(request, question_id): return HttpResponse("You're looking at question

Django tutorial part4

writing_first_django_app_part4 Write a simple form 点击每个Question进去detail界面,看到的vote我们希望以选择的形式给用户进行选择,然后将结果以表格的形式POST到服务器. # polls/templates/polls/detail.html <h1>{{ question.question_text }}</h1> {% if error_message %}<p><strong>{{ e

Django tutorial part5

writing_first_django_app_part5 Automated Testing 解决问题一个很好的方法是首先描述这个问题,然后写出代码来实现它.但是很多人习惯先写好代码然后再进行调试找问题.也许在写代码之前先写好一些测试会是更好的选择. A little bug 前面在我们的Question.was_published_recently()函数中有一个小问题,如果它是一天之内创建的则会返回True,但是如果pub_date是未来的时间也会返回True 通常应用的测试会放到tes

Django tutorial part2

writing_first_django_app_part2 Create super user 下面开始创建管理者帐号: $ python manage.py createsuperuser 输入用户名和密码,邮箱之后创建帐号 运行runserver之后,进入http://127.0.0.1:8000/admin/ 可以登录管理界面 登录之后这时在管理界面还没能看到我们的poll应用,我们需要告诉admin我们的Question对象需要在管理界面显示,修改polls/admin.py: fro

Django tutorial part1

writing_first_django_app_part1 Creating a project 查看django版本: $ python -c "import django; print(django.get_version())" 创建工程,进入需要放置工程的目录: $ django-admin.py startproject mysite 会创建以下文件: mysite/ manage.py mysite/ __init__.py settings.py urls.py wsg

Django tutorial part6

writing_first_django_app_part6 在django中,网页应用中的一些附加文件,如image, JS, CSS等,称为静态文件"static files" django.contrib.staticfiles: 从各个应用中收集静态文件,放到一个单独的位置,方便使用和管理 Using CSS 静态文件查找路径的时候与template类似,首先在polls目录下创建目录static,在里面再创建一个polls目录,在这个polls目录里面才放置静态文件,现在创建

Pyhon + Django 1.7.2 tutorial + virtualenv简单使用

最近换了工作, 进的team项目中大概是个python + django的组合, python本身的语法以及特性撸过一边之后,这两天按着django官方的文档倒腾了几天, 文档非常详细,本人英语水平也就那样,基本没什么压力,建议像我一样的新手直接去看官方文档,首先内容绝对是更新到了最新的版本,内容组织渐进有序,当然咯,就算按照文档一步一步来,倒腾的过程中总归会碰到些问题,这边博文权当给个记个流水账以后能翻翻或者说有更深的理解了顺便来update下,看看自己的一些思考方式,若果顺便也能给其他人带来

Django 1.6 CBVs

Django 1.6 最佳实践: 如何正确使用 CBVs (Class-based views) Class-based views是Django为解决建站过程中的常见的呈现模式而建立的. 在这节中, 我们着重讲一下CBVs的使用技巧和一般原则. 1. CBVs的使用原则 代码越少越好 永远不要重复代码 View应当只包含呈现逻辑, 不应包括业务逻辑 保持view逻辑清晰简单 不要将CBVs用作403, 404, 500的错误处理程序 保持mixin简单明了 2. 如何使用mixin 在编程中m