[翻译]Django 1.0 中文文档—–指导 第三部分 发布视图

编写你的Django应用 第三部分

我们接着上篇开始,继续网页投票应用,本篇我们着重在建立发布视图。

理念

视图在Django中就是一个特定功能和特定模板的网页,例如在博客程序中你会有如下视图:

  • 博客首页 – 显示最新记录.
  • 进入详细内容页面 – 页面固定链接.
  • 基于年的存档页 – 显示给定年里所有月份的进入点.
  • 基于月的存档页 – 显示给定月里所有天的进入点. .
  • 基于日的存档页 – 显示给定日里所有天的进入点.
  • 评论 – 所有评论的进入链接.

 

在我们的投票应用程序中,我们有下面四个视图:

 

  • Poll “archive” 页 – 显示最新的投票.
  • Poll “detail” 页  – 显示投票页面.
  • Poll “results” 页 – 显示投票结果.
  • Vote action – 处理投票程序的页面.

 

在Django里,每个视图都是用一个简单的python函数描述的。

设计你的urls

 

编写视图第一步是设计你的URL结构,需要借助python的一个组件URLconf将python代码和URL联系起来。

当用户请求Django的页面,系统会查找ROOT_URLCONF 设置,Django加载组件并查找urlpatterns变量,一段类似如下格式的序列:

(regular expression, Python callback function [, optional dictionary])

Django会从第一个规则表达式开始,一直往下,匹配请求的URL直到匹配上,当找到匹配的时候,Django会回调函数,为第一个参数传入HttpRequest 对象,还有表达式里捕获的值。

要了解更多HttpRequest,URLconfs详情,可查看具体文档。

当我们创建工程的时候,mysite/urls.py会被自动创建。settings.py中默认配置指定位置ROOT_URLCONF = ‘mysite.urls’
编辑mysite/urls.py:

  1. from django.conf.urls.defaults import *
  2. urlpatterns = patterns(”,
  3.     (r’^polls/$’, ‘mysite.polls.views.index’),
  4.     (r’^polls/(?P<poll_id>\d+)/$’, ‘mysite.polls.views.detail’),
  5.     (r’^polls/(?P<poll_id>\d+)/results/$’, ‘mysite.polls.views.results’),
  6.     (r’^polls/(?P<poll_id>\d+)/vote/$’, ‘mysite.polls.views.vote’),
  7. )

 

当有”/polls/23/”这样的地址请求时,python 会匹配到 r’^polls/(?P<poll_id>\d+)/$’ 这里,然后调用

mysite/polls/views.py里的detail()函数,如下:

 

 

 

 

 

detail(request=<HttpRequest object>, poll_id=’23’)

 

poll_id=’23’ 来自(?P<poll_id>\d+). 通过正则匹配捕获的值,这里也可以定义多个值来捕获。

因为URL定义没有什么扩展名定义限制你也可以像这样定义

(r’^polls/latest\.php$’, ‘mysite.polls.views.index’),
用php做扩展名,看起来比较幽默。不过最好还是不要定义扩展名。

 

注意,URL表达式是不包括GET,POST参数和域名。例如http://www.example.com/myapp/,URL配置为/myapp/。

http://www.example.com/myapp/?page=3 也同样匹配/myapp/

 

表达式会在django加载的时候编译。

 

编写你的第一个视图

 

好,我们还没有创建视图,只是创建了URLconf,接下来我们确认下URLconf。

启动django服务

 

python manage.py runserver

我们访问”http://localhost:8000/polls/“,我们会看到下面的报错信息:

 

ViewDoesNotExist at /polls/

Tried index in module mysite.polls.views. Error was: ‘module’
object has no attribute ‘index’

 

这个信息提示我们没有在mysite/polls/views.py里创建 index() 函数

测试”/polls/23/”, “/polls/23/results/” 和 “/polls/23/vote/”. 都会有错误提示没有创建视图函数。

 

打开mysite/polls/views.py文件加入下面的代码:

 

  1. from django.http import HttpResponse
  2. def index(request):
  3.     return HttpResponse(“Hello, world. You’re at the poll index.”)

 

这是个简单的视图,访问”/polls/” 你会看到相应的内容输出。

我们继续创建接下来的视图,这个有一点不通,多了一个参数

 

 

 

 

  1. def detail(request, poll_id):
  2.     return HttpResponse(“You’re looking at poll %s.” % poll_id)

 

访问”/polls/34/”. 你会看到URL传入的ID

 

写一个有实际功能的视图

 

每个视图都会负责做些事情,返回一个HttpResponse 对象,包含请求页面的内容,或抛出HTTP 404 异常。

视图可以读取数据库数据,可以使用Django带的模板,也可以使用第三方模板,还可以输出PDF,XML,ZIP等。

为了方便,我们用DJANGO自己的数据库API根据发布时间显示5挑问卷,用逗号分开

 

  1. from mysite.polls.models import Poll
  2. from django.http import HttpResponse
  3. def index(request):
  4.     latest_poll_list = Poll.objects.all().order_by(‘-pub_date’)[:5]
  5.     output = ‘, ‘.join([p.question for p in latest_poll_list])
  6.     return HttpResponse(output)

有个问题,如果页面比较复杂,这里用python编写html会很麻烦,那么我们可以使用django的模板来解决。

 

  1. from django.template import Context, loader
  2. from mysite.polls.models import Poll
  3. from django.http import HttpResponse
  4. def index(request):
  5.     latest_poll_list = Poll.objects.all().order_by(‘-pub_date’)[:5]
  6.     t = loader.get_template(‘polls/index.html’)
  7.     c = Context({
  8.         ‘latest_poll_list’: latest_poll_list,
  9.     })
  10.     return HttpResponse(t.render(c))

程序会调用”polls/index.html”模板,同时会传入一个字典到给模板,刷新页面你会看到下面输出

 

TemplateDoesNotExist at /polls/
polls/index.html

 

提示没有这个模板文件,我们编辑 TEMPLATE_DIRS 在 settings.py 文件中,设置模板目录,在”[template_directory]/polls/index.html” 位置添加模板文件,代码入校

 

  1. {% if latest_poll_list %}
  2.     <ul>
  3.     {% for poll in latest_poll_list %}
  4.         <li>{{ poll.question }}</li>
  5.     {% endfor %}
  6.     </ul>
  7. {% else %}
  8.     <p>No polls are available.</p>
  9. {% endif %}

 

一个快捷方法: render_to_response()

 

  1. from django.shortcuts import render_to_response
  2. from mysite.polls.models import Poll
  3. def index(request):
  4.     latest_poll_list = Poll.objects.all().order_by(‘-pub_date’)[:5]
  5.     return render_to_response(‘polls/index.html’, ‘latest_poll_list’: latest_poll_list})

 

抛出404

 

投票详细内容视图

 

  1. from django.http import Http404
  2. # …
  3. def detail(request, poll_id):
  4.     try:
  5.         p = Poll.objects.get(pk=poll_id)
  6.     except Poll.DoesNotExist:
  7.         raise Http404
  8.     return render_to_response(‘polls/detail.html’, {‘poll’: p})

 

如果请求的投票ID 不存在,就会升级404 异常

 

快捷函数 get_object_or_404()

 

  1. from django.shortcuts import render_to_response, get_object_or_404
  2. # …
  3. def detail(request, poll_id):
  4.     p = get_object_or_404(Poll, pk=poll_id)
  5.     return render_to_response(‘polls/detail.html’, {‘poll’: p})

 

同样还有一个 get_list_or_404() 函数

 

使用模板系统

 

回到投票detail()视图,在模板路径建立”polls/detail.html” 文件

 

 

  1. <h1>{{ poll.question }}</h1>
  2. <ul>
  3. {% for choice in poll.choice_set.all %}
  4.     <li>{{ choice.choice }}</li>
  5. {% endfor %}
  6. </ul>

 

 

{{ poll.question }}是用点语法访问变量的属性或者字典的KEY,{% for %}是模板脚本的循环,poll.choice_set.all 投票选项的所有记录。

 

简化URLconfs

 

  1. urlpatterns = patterns(”,
  2.     (r’^polls/$’, ‘mysite.polls.views.index’),
  3.     (r’^polls/(?P<poll_id>\d+)/$’, ‘mysite.polls.views.detail’),
  4.     (r’^polls/(?P<poll_id>\d+)/results/$’, ‘mysite.polls.views.results’),
  5.     (r’^polls/(?P<poll_id>\d+)/vote/$’, ‘mysite.polls.views.vote’),
  6. )

视图函数部分都是完整的名称,我们可以简化下配置:

 

  1. urlpatterns = patterns(‘mysite.polls.views’,
  2.     (r’^polls/$’, ‘index’),
  3.     (r’^polls/(?P<poll_id>\d+)/$’, ‘detail’),
  4.     (r’^polls/(?P<poll_id>\d+)/results/$’, ‘results’),
  5.     (r’^polls/(?P<poll_id>\d+)/vote/$’, ‘vote’),
  6. )

mysite.polls.views 提取出来,这样URL配置更简化了些。

 

解耦URLconfs

 

URLs 可以分多个文件模块配置,通过include包含进来。

(r’^polls/’, include(‘mysite.polls.urls’)),
polls/相关的请求就会到mysite/polls/urls.py查找匹配

 

mysite/polls/urls.py如下:

 

 

 

 

  1. urlpatterns = patterns(‘mysite.polls.views’,
  2.     (r’^$’, ‘index’),
  3.     (r’^(?P<poll_id>\d+)/$’, ‘detail’),
  4.     (r’^(?P<poll_id>\d+)/results/$’, ‘results’),
  5.     (r’^(?P<poll_id>\d+)/vote/$’, ‘vote’),
  6. )

去掉了polls/部分

2,791 thoughts on “[翻译]Django 1.0 中文文档—–指导 第三部分 发布视图”

  1. [url=https://doxycycline1.com/]buy doxycycline 100mg[/url] [url=https://valtrex1.com/]order valtrex onlines[/url] [url=https://amoxicillin5.com/]buy amoxicilina 500 mg[/url] [url=https://tadalafil365.com/]tadalafil[/url] [url=https://lasix911.com/]buy lasix without prescription[/url]

  2. смотреть фильм фильм бесплатно hd

    быстрее выше сильнее 2019 фильм смотреть онлайн

    смотреть фильм фильм бесплатно на бигсинема

    смотреть трейлер к фильму полный фильм

    http://minskysoft.ru

  3. [url=http://tadalafilpro.com/]buy tadalafil[/url] [url=http://20tadalafil.com/]tadalafil tablets 20mg[/url] [url=http://amoxicillin250.com/]amoxicillin 250mg[/url] [url=http://albuteroli.com/]cost of albuterol inhaler[/url] [url=http://dapoxetineusa.com/]dapoxetine usa[/url] [url=http://acyclovir200.com/]acyclovir[/url] [url=http://cafergotbuy.com/]cafergot[/url] [url=http://cialis60.com/]cialis 60[/url] [url=http://propecia5mg.com/]propecia[/url] [url=http://allopurinol300.com/]allopurinol 300[/url] [url=http://prednisone40.com/]prednisone[/url] [url=http://tetracyclinerx.com/]tetracycline[/url] [url=http://levitra10.com/]levitra buy[/url] [url=http://lisinoprilmed.com/]lisinopril 10 mg[/url] [url=http://furosemide80.com/]furosemide 40 mg tablets online[/url] [url=http://propranolol80.com/]propranolol buy online[/url] [url=http://sildenafilcitrate50.com/]sildenafil citrate 50mg[/url] [url=http://phenergandm.com/]phenergan generic[/url] [url=http://ventolinsale.com/]ventolin[/url] [url=http://prednisolone1.com/]buying prednisolone 5mg online without prescription[/url]

  4. смотреть онлайн фильмы в хорошем качестве русские

    смотреть фильм боги египта в качестве

    фильмы в хорошем качестве

    смотреть фильм волна в хорошем качестве

    фильм бесплатно смотреть в нижнем новгороде

    В хорошем качестве дивитися полный фильм

  5. Thank you, I have recently been looking for information approximately this subject
    for a while and yours is the greatest I have found out so far.
    However, what in regards to the bottom line? Are you positive about the source?
    Neue Wolfsburg trikot

  6. Hey there! I just wanted to ask if you ever have any issues with hackers?
    My last blog (wordpress) was hacked and I ended up losing several weeks of hard work due to no backup.

    Do you have any methods to protect against hackers? inter Trøje

  7. [url=https://lender.us.org/]payday lender[/url] [url=https://moneyfast.us.org/]need money fast[/url] [url=https://simpleloan.us.org/]simple loan[/url] [url=https://lending.us.org/]personal loans for bad credit guaranteed[/url] [url=https://badcredit.us.org/]best loans for bad credit[/url]

  8. [url=http://buyamitriptyline.team/]buy amitriptyline[/url] [url=http://1statenololnow.com/]atenolol pills[/url] [url=http://misoprostol.store/]buy cytotec online usa[/url] [url=http://levitra.best/]lavitra10mg[/url] [url=http://buyalbendazole.us.com/]generic albendazole[/url] [url=http://buyalbuterol.team/]albuterol cost[/url] [url=http://sildenafil.yoga/]where to buy sildenafil citrate online[/url]

  9. Pingback: nike air max
  10. 95 Slow Drip-Feed Authentic followers Free Video Views Unlimited Uploads Random Auto followers Buy Now 1000 Auto followers $ 56. Krootez Our Instagram views increase your visibility that in turn increases your business. The only difference is that we guarantee to provide genuine, active Instagram views for all photos.

  11. Drinking a cup of coffee or brushing your teeth will even be longer than seeing the likes coming in on your latest photo in Instagram. krootez.com Delay likes Delivery Delay likes Delivery Delay likes You may adjust the speed of how fast or slow you would likes your likes to come in. When I had only 7000+ likes I was reaching up between 10K & 20K accounts per post!

  12. Pingback: nike air max 2017
  13. Pingback: jordan retro 6