源地址:http://django-chinese-docs-16.readthedocs.org/en/latest/intro/overview.html
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
注:#前提是你已经在 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)
注:#在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()
在定义好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,然后在开发展现数据的方式。
创建干净,优雅的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')
每个视图只做两件事:返回一个包含请求页面内容的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
注: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.
看来之前理解错了。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 的功能。以下是一些更有用的功能:
显然,下一步你应该 下载 Django, 阅读 入门教程, 并且加入 社区. 感谢您的关注!
-------引用来自官方文档的话。
买饭去了,待会继续...
-- 2014.7.24 19:35