Chinaunix首页 | 论坛 | 博客
  • 博客访问: 200479
  • 博文数量: 62
  • 博客积分: 725
  • 博客等级: 上士
  • 技术积分: 746
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-09 17:07
个人简介

exyz

文章分类

全部博文(62)

分类: Web开发

2015-02-03 23:27:40


点击(此处)折叠或打开

  1. 1.自定义管理页面的样式
  2.     自定义项目模板
  3.         django可以以任何账户运行,所以当你创建一个 templates 目录,然后确保这个目录能被运行django的账号访问到就可以。
  4.         但,把模板放在项目中是一个好的主意。
  5.         模板的配置文件是 exyz/setting.oy ,在里面添加 TEMPLATE_DIRS 设置,TEMPLATE_DIRS 是django载入模板的搜索路径设置
  6.         exyz/settings.py
  7.             TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]
  8.         在 templates 目录里创建 admin 目录,从Django默认管理模板目录(django/contrib/admin/templates)复制 admin/base_site.html 到admin中。
  9.         mkdir -p /django/exyz/polls/templates/admin
  10.         cp /usr/local/lib/python2.7/site-packages/django/contrib/admin/templates/admin/base_site.html /django/exyz/polls/templates/admin/
  11.         
  12.         #怎么找到源码文件位置呢?
  13.         python -c "import sys ;sys.path = sys.path[1:];import django;print(django.__path__)"
  14.     
  15.     自定义应用和管理页面模板
  16. 2.Blog
  17.     Blog 元素:blog 主页、详细页面、基于年,月,日的页面、评论。
  18.     Poll 应用中,有这些视图元素:问题主页、问题详细页面、问题结果页面、投票页面。
  19.     下面的内容重在 URL 设置,详细:https://docs.djangoproject.com/en/1.7/ref/urlresolvers/#module-django.core.urlresolvers
  20.     
  21.     2.1 第一个视图
  22.         先编辑投票应用的视图文件
  23.         polls/views.py
  24.             from django.http import HttpResponse

  25.             def index(request):
  26.                 return HttpResponse("Hello, world. You're at the polls index.")
  27.         这可能是Django最简单的视图了,调用这个视图,需要在 URL 中映射它,那么需要 URLconf 来配置了。
  28.         
  29.         创建urls.py 文件就可以创建 URLconf了,urls.py 应该在polls应用目录中和模型,视图文件在同级。
  30.         polls/urls.py
  31.             from django.conf.urls import patterns, url
  32.             from polls import views

  33.             urlpatterns = patterns('',
  34.                 url(r'^$', views.index, name='index'),
  35.             )

  36.         下一步就需要在 exyz/urls.py 根URLconf中用 include() 来加载 polls.urls 模块:
  37.         (如果这里有看到 admin.autodiscover() ,那么说明django的版本不对~)
  38.         exyz/urls.py
  39.             from django.conf.urls import patterns, include, url
  40.             from django.contrib import admin

  41.             urlpatterns = patterns('',
  42.                 url(r'^polls/', include('polls.urls')),
  43.                 url(r'^admin/', include(admin.site.urls)),
  44.             )
  45.             
  46.         现在访问(前提是已经 runserver 了)http://IP:8000/polls 就可以看到上面视图里面的“Hello, world”了。
  47.         
  48.     2.2 URL()
  49.     url() 函数传递了四个参数,两个是必须的:正则表达式和视图,两个是可选的,kwargs和 name。
  50.         2.2.1 url() 参数之一:正则表达式
  51.             需要注意的是,这些正则表达式不会匹配 GET 和 POST 参数,或者域名。
  52.             比如,有个请求是 http://www.example.com/myapp/ ,URLconf 会找到 myapp ;
  53.             如果有个请求是 http://www.example.com/myapp/?page=3 ,那么URLconf 找到的还是 myapp。
  54.                 Python 正则模块: http://www.example.com/myapp/?page=3
  55.             还有,就是当URLconf模块第一次加载的时候就已经编译了,它的查找速度是很快的,只要查找不复杂。
  56.         
  57.         2.2.2 url() 参数之二:视图 ?????
  58.             当django找到一个正则表达式,它会调用特定的视图函数,将 HttpRequest 对象作为第一个参数,
  59.             任何从正则匹配到的其它值会作为其它的参数。如果正则使用简单的捕获,值会作为一个位置参数传递;
  60.             如果使用的是命名捕获,值会作为一个关键参数传递。
  61.         2.2.3 url() 参数之三:kwargs
  62.             任何关键字参数可以传递到目标页面。这里不使用。
  63.         2.2.4
  64.             命名URL会让你从其它任何地方指向它,尤其是django模板。
  65.             这个强大的特性使得能够值改变一个文件让rul匹配发生大的全局改变。

  66.     2.3 更多的视图
  67.         增加更多的视图到 polls/view.py 中,这次加入一些参数进去:
  68.         polls/views.py
  69.             def detail(request, question_id):
  70.                 return HttpResponse("You're looking at question %s." % question_id)

  71.             def results(request, question_id):
  72.                 response = "You're looking at the results of question %s."
  73.                 return HttpResponse(response % question_id)

  74.             def vote(request, question_id):
  75.                 return HttpResponse("You're voting on question %s." % question_id)

  76.         把这些视图加入到 polls.urls 中,使用 call() 函数:
  77.         polls/urls.py
  78.             from django.conf.urls import patterns, url

  79.             from polls import views

  80.             urlpatterns = patterns('',
  81.                     # ex: /polls/
  82.                 url(r'^$', views.index, name='index'),
  83.                     # ex: /polls/5/
  84.                 url(r'^(?P\d+)/$', views.detail, name='detail'),
  85.                     # ex: /polls/5/results/
  86.                 url(r'^(?P\d+)/results/$', views.results, name='results'),
  87.                     # ex: /polls/5/vote/
  88.                 url(r'^(?P\d+)/vote/$', views.vote, name='vote'),
  89.             )        
  90.         
  91.         加入的相应的url规则,可以访问 “/polls/34/” 这样的页面了。它会调用 detail() 方法来显示在浏览器中提供的ID值。
  92.         试着访问 “/polls/34/results/” 和 “/polls/34/vote/” 会得到相应的占位结果和投票页面。

  93.         如果用户访问 “/polls/34/”,Django 会匹配到 '^polls/',然后Django会去掉匹配到的文本"polls/",然后把剩下的文本内容"34/"发送到“polls.urls”用URLconf进一步处理。
  94.         然后会用 r'^(?P\d+)/$'    匹配后调用 detail() 得到:
  95.             detail(request=<HttpRequest object>, question_id='34')
  96.         question_id='34' 来自 (?P<question_id>\d+)"()"是一个用来捕获文本值的,?P<question_id> 定义了要匹配的名字,\d+ 是正则匹配一串数字的。

  97.         因为URL正则的存在,几乎没有什么做不到的。没有必要加个后缀,比如“.html”,真要加的话(还是不建议)
  98.             (r'^polls/latest\.html$', 'polls.views.index'),

  99.     2.4 写些可操作的视图
  100.         每个视图会做2件事中的一种:根据请求页面返回包含内容的ttpResponse对象;或者得到一个意料之外的页面请求返回 Http404.
  101.         视图可以选择是否从数据库读数据。视图可以使用一个系统模板,比如Django的或者第三方的PYthon系统模板。
  102.         视图可以产生一个PDF文件、输出到XML文件、新建一个ZIP,轻轻松松,任何事情你想到的,Python库里有的你都可以做到。
  103.         
  104.         Django 想做的只是 HttpRequest 。
  105.         因方便,之前是使用Django自己的数据库API。
  106.         有个 index() 视图函数,可以在系统中按照发布时间使用逗号分隔,展示出最新的5个投票问题,
  107.         polls/views.py
  108.             from django.http import HttpResponse

  109.             from polls.models import Question

  110.             def index(request):
  111.                 latest_question_list = Question.objects.order_by('-pub_date')[:5]
  112.                 output = ', '.join([p.question_text for p in latest_question_list])
  113.                 return HttpResponse(output)
  114.                 
  115.         为了给投票页面增加样式,在应用中模板中新建 polls 文件夹,然后新建 index.html 模板页面:
  116.         mkdir -p /django/exyz/polls/templates/polls/
  117.         polls/templates/polls/index.html
  118.             {% if latest_question_list %}
  119.                 <ul>
  120.                 {% for question in latest_question_list %}
  121.                     <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
  122.                 {% endfor %}
  123.                 </ul>
  124.             {% else %}
  125.                 <p>No polls are available.</p>
  126.             {% endif %}

  127.         更新了模板,把视图也更新一下:
  128.         polls/views.py
  129.             from django.http import HttpResponse
  130.             from django.template import RequestContext, loader

  131.             from polls.models import Question


  132.             def index(request):
  133.                 latest_question_list = Question.objects.order_by('-pub_date')[:5]
  134.                 template = loader.get_template('polls/index.html')
  135.                 context = RequestContext(request, {
  136.                     'latest_question_list': latest_question_list,
  137.                 })
  138.                 return HttpResponse(template.render(context))

  139.         上面的代码加载了 polls/index.html 模板,然后把值(context)传递给它。
  140.         Python对象中的内容(context)是一个字典,它和模板变量的值是映射的。
  141.         浏览器转到 “/polls/”就可以看到圆点列表和之前所创建的问题,相应的链接是详细内容。
  142.     

  143.     2.5    一种捷径:render()
  144.             载入模板是常用的方法,用HttpResponse对象填充内容然后用剩下的模板内容补充。
  145.             Django提供一种捷径方法 render(),改写后的 index()    视图:
  146.             polls/views.py
  147.                 from django.shortcuts import render

  148.                 from polls.models import Question


  149.                 def index(request):
  150.                     latest_question_list = Question.objects.order_by('-pub_date')[:5]
  151.                     context = {'latest_question_list': latest_question_list}
  152.                     return render(request, 'polls/index.html', context)
  153.             一旦这样做,就没有必要载入 loader, RequestContext 和HttpResponse模块了,但如果还想使用 detail, results, 和vote子方法应该继续保留 HttpResponse 模块。
  154.             render() 函数会将请求对象作为第一个参数,模板名字是它的第二个参数,Python字典作为可选的第三个参数。函数返回给定模板包含上下文和HttpResponse对象。
  155.             
  156.             如果视图中存在2个index函数,那么最后一个函数将会被使用,第一个index函数会被无视。
  157.     2.6 使用 404 页面
  158.         在问题的详细页面中会显示特定的投票项文本,下面是新的视图页面:
  159.         polls/views.py
  160.             from django.http import Http404
  161.             from django.shortcuts import render

  162.             from polls.models import Question
  163.             # ...
  164.             def detail(request, question_id):
  165.                 try:
  166.                     question = Question.objects.get(pk=question_id)
  167.                 except Question.DoesNotExist:
  168.                     raise Http404("Question does not exist")
  169.                 return render(request, 'polls/detail.html', {'question': question})
  170.         这里添加新的内容,如果请求的问题ID不存在,那么会返回404错误。同时使用了上面说的render函数,加载详细内容 detail.html模板。
  171.         新增模板文件:
  172.         polls/templates/polls/detail.html
  173.             {{ question }}
  174.         现在试着请求个 http://IP:8000/polls/33 页面,那么就会返回 404 页面了。
  175.     2.7 一种捷径:get_object_or_404()
  176.         如果请求的对象不存在使用 get() 然后 raise Http404 。Django提供了剪短的方式,改写detail()函数:
  177.         polls/views.py
  178.             from django.shortcuts import get_object_or_404, render

  179.             from polls.models import Question
  180.             # ...
  181.             def detail(request, question_id):
  182.                 question = get_object_or_404(Question, pk=question_id)
  183.                 return render(request, 'polls/detail.html', {'question': question})

  184.          get_object_or_404() 函数使用django模型作为第一个参数,调用get()方法获得关键字数值来查询,如果不存在返回404页面。
  185.          也有一个 get_list_or_404() 函数,就像和 get_object_or_404() 一样,只是它用的是 filter() 而不是 get().

  186.     2.8 使用模板系统
  187.         回到投票应用的 detail() 视图。给上下文赋变量question,polls/detail.html 模板的样子:
  188.         polls/templates/polls/detail.html
  189.             <h1>{{ question.question_text }}</h1>
  190.             <ul>
  191.             {% for choice in question.choice_set.all %}
  192.                 <li>{{ choice.choice_text }}</li>
  193.             {% endfor %}
  194.             </ul>
  195.         模板系统使用了 . 语法来获取变量属性。在 {{ question.question_text }} 中,django会查找 question 对象字典。
  196.         如果没有找到,会按属性查找,这里会生效。如果属性查找失败,它会尝试索引列表查找。
  197.         {% for %} 循环中调用 question.choice_set.all 方法,它会在循环中重复返回 Choice 对象值。
  198.     更多模板介绍:https://docs.djangoproject.com/en/1.7/topics/templates/
  199.     
  200.     2.9 移除模板中的硬urls
  201.         在 polls/index.html 模板中写问题的链接,会有部分硬编码:
  202.             <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
  203.         这样对于大的应用来说很麻烦,由于在 polls.urls 中可以在 url()添加参数,使用 {% url %} 可以不依赖特定的路径。
  204.             <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>    
  205.         这样有效是因为 polls.urls模块会查找特定的 URL 规则,就像下面定义的URL名字是 ‘detail’ :
  206.             ...
  207.             # 'name' 的值是通过 {% url %} 模板标签进行调用的
  208.             url(r'^(?P\d+)/$', views.detail, name='detail'),
  209.             ...
  210.         如果想改变 polls 的详细页面的URL,比如改成 polls/specifics/12/ 而不是 polls/urls.py ,即添加不存在的“specifics”标签:
  211.             ...
  212.             # 增加新的词 'specifics'
  213.             url(r'^specifics/(?P\d+)/$', views.detail, name='detail'),
  214.             ...
  215.     3.0 命名URL名字
  216.         Django项目中应该有很多的应用,Django如何在不同应用中区分URL 名字呢?
  217.         比如投票应用有一个 detail (详细)视图,也许在这个项目中也有一个blog,那么怎么让Django为每个应用创建单独的 {% url %} 标签呢?
  218.         
  219.         有个答案是在根 URLconf(即项目的url配置文件)中增加命名空间。编辑该配置 exyz/urls.py :
  220.         mysite/urls.py
  221.             from django.conf.urls import patterns, include, url
  222.             from django.contrib import admin

  223.             urlpatterns = patterns('',
  224.                 url(r'^polls/', include('polls.urls', namespace="polls")),
  225.                 url(r'^admin/', include(admin.site.urls)),
  226.             )
  227.         相应的,对 polls/index.html 模板进行相应的改变 :
  228.         polls/templates/polls/index.html
  229.             <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
  230.             --->
  231.             <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li


阅读(1568) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~