七日Python之路--第四天(之Django官方文档)

时间:2022-07-22
本文章向大家介绍七日Python之路--第四天(之Django官方文档),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

(一)初探Django

源地址:http://django-chinese-docs-16.readthedocs.org/en/latest/intro/overview.html

(1)设计模型model
from django.db import models

# Create your models here.

class Repoter(models.Model):
    full_name = models.CharField(max_length=200)
    def __unicode__(self):
        return self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    repoter = models.ForeignKey(Repoter)
    def __unicode__(self):
        return self.headline
(2)安装模型

注:#前提是你已经在 settings.py 文件中的 INSTALLED_APP 中声明了该应用。 #该命令会创建所有在此声明的应用的所需数据库表

dizzy@dizzy-pc:~/Python/django_project/p1$ ./manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): y
Please enter either "yes" or "no": yes
Username (leave blank to use 'dizzy'): 
Email address: lpe234@qq.com
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
(3)享用便捷的API

注:#在Ubuntu下面,可以使用一下命令进入manege.py 的 Shell 交互模式 >>> python manage.py shell

#导入在“news”应用中创建的“model”
>>> from news.modles import Repoter,Article

#系统中还没有Repoter
>>> Repoter.objects.all()
[]

#创建一个Repoter
>>> r = Repoter(full_name='John Smith')

#将对象保存到数据库中
>>> r.save()

#此时该对象拥有了一个ID
>>> r.id
1

#现在新的Repoter已经在数据库里面了
>>> Repoter.objects.all()
[<Repoter: John Smith>]

#字段被表示成为Python对象的属性
>>> r.full_name
'John Smith'

#Django提供了丰富的数据库查询 API
>>> Repoter.objects.get(id=1)
>>> Repoter.objects.get(full_name__startswith='John')
>>> Repoter.objects.get(full_name__contains='mith')

#创建一个 article
>>> from datetime import date
>>> a = Article(pub_date=date.today(),headline='Django is cool',content='Year.',repoter=r)
>>> a.save()

#现在article已经存在数据库中了
>>> Article.objects.all()
[<Article: Django is cool>]

#通过修改一个对象的属性值,然后调用save()方法来更新数据
>>> r.full_name = 'Billy Goat'
>>> r.save()

#调用delete()方法来删除一个对象
>>> r.delete()
(4)一个动态的管理接口:不仅仅是一个脚手架-还是个完整的房子。

在定义好models之后,Django能自动创建一个管理界面。可以添加,删除以及修改对象。

注:在admin.py 中,将所需的models引入, 然后注册即可。 admin.site.register(model)。这样重启服务,就能在admin管理界面上看到注册的model了,并能够对其进行新增,修改,删除操作。甚是方便!!!

# 在news下的 models.py

from django.db import models

# Create your models here.

class Repoter(models.Model):
    full_name = models.CharField(max_length=200)
    def __unicode__(self):
        return self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    repoter = models.ForeignKey(Repoter)
    def __unicode__(self):
        return self.headline

#在news下的 admin.py

from django.contrib import admin

# Register your models here.

import models

admin.site.register(models.Article)
admin.site.register(models.Repoter)

在一个创建Django应用的典型工作流中,首先需要创建模型。并尽快的启动和运行admin site,然后在开发展现数据的方式。

(5)展现你的URLs

创建干净,优雅的URL方案。

注:url配置需要使用到正则表达式!!!多用就不会忘记了!

#在news app中新建 urls.py
from django.conf.urls import patterns

urlpatterns = patterns('',
    ('^articles/(d{4})/$', 'views.year_archive'),
    ('^article/(d{4})/(d{2})/$','views.month_archive'),
    ('^article/(d{4})/(d{2})/(d+)/$','views.article_detail'),
)

#在在根配置urls中,引入app中的urls即可
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()

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

    url(r'^admin/', include(admin.site.urls)),
    url(r'',include('news.urls'))
)

当用户请求一个页面时,Django就会按顺序去匹配每个模式,并停在地一个匹配的URL上。一旦匹配成功,Django将导入并调用相应的视图。

每个视图都将得到一个request对象,它包含request的meta信息和正则表达式所捕获到的值。

例如:用户请求URL. ‘/articles/2014/07/24/’,Django将会这样调用函数:

news.views.articel_detail(request, '2014', '07', '24')

(6)编写你的视图

每个视图只做两件事:返回一个包含请求页面内容的Httpesponse对象;或者抛出一个异常。

通常一个视图会根据参数来检索数据,加载一个模板并根据该模板来呈现检索出来的数据。

下面是year_archive的例子:

from django.shortcuts import render

# Create your views here.

from django.shortcuts import render_to_response
from models import Article

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    return render_to_response('year_archive.html',{'year':year,'article_list':a_list})

def month_archive(request, year, month):
    pass

def article_detail(request, year, month, day):
    pass
(7)设计你的模板

注:Django的app默认模板位置在app文件夹下的'templates'下面。路径书写时,以'templates'文件夹下按根目录。

Django 有一个模板搜索路径板,它让你尽可能的减少冗余而重复利用模板。在你的 Django设置中,你可以指定一个查找模板的目录列表。如果一个模板没有在这个 列表中,那么它会去查找第二个,然后以此类推。

<!-- 位置 news/templates/year_archive.html -->
<!-- 在views.py 文件中,直接使用 'year_archive.html' -->

{% block title %}Articles for {{ year }}{% endblock %}

{% block content %}
<h1>Articles for {{ year }}</h1>

{% for article in article_list %}
    <p>{{ article.headline }}</p>
    <p>By {{ article.repoter.full_name }}</p>
    <p>Published {{article.pub_date|date:"F j, Y"}}</p>
{% endfor %}
{% endblock %}

这个结构应该很容易就能看懂。block title 和 block content。其中还有一个for循环,遍历文章列表。变量的引用,则使用 '{{ element }}' 双花括号。

注:注意 {{ article.pub_date|date:"F j, Y" }} 使用了 Unix 风格的“管道”(“|”符合)。这就是所谓的模板过滤器,一种通过变量来过滤值的方式。本例中,Python datetime 对象被过滤成指定的格式(在 PHP 的日期函数中可以见到这种变换)。 .........不太理解.有待研究........Orz.

(8)后记

看来之前理解错了。block XXX 只是一个标识符而已。

最后,Django 使用了“模板继承”的概念: 这就是 {% extends "base.html" %}所做的事。它意味着 “首先载入名为 ‘base’的模板中的内容到当前模板, 然后再处理本模板中的其余内容。”总之,模板继承让你在模板间大大减少冗余内容: 每一个模板只需要定义它独特的部分即可。

在year_archive.html 顶部加上

{% extends "base.html" %}

其中base.html内容如下:

{% load staticfiles %}<html><head>
    <title>{% block title %}{% endblock %}</title></head><body>
    <img src="{% static "images/sitelogo.png" %}" alt="Logo" />
    {% block content %}{% endblock %}</body></html>

突然感觉我那些日子学的Java水平也不过如此............实在汗颜...............


这仅仅是一点皮毛

这里只是简要概述了 Django 的功能。以下是一些更有用的功能:

  • 一个 缓存框架 可以与 memcached 或其他后端缓存集成。
  • 一个 聚合框架 可以让创建 RSS 和 Atom 的 feeds 同写一个小小的 Python 类一样容易。
  • 更性感的自动创建管理站点功能 – 本文仅仅触及了点皮毛。

显然,下一步你应该 下载 Django, 阅读 入门教程, 并且加入 社区. 感谢您的关注!

-------引用来自官方文档的话。


买饭去了,待会继续...

-- 2014.7.24 19:35