欢迎各位兄弟 发布技术文章
这里的技术是共享的
Django介绍
快速安装
编写你第一个Django app,part1
编写你第一个Django app,part2
编写你第一个Django app,part3
编写你第一个Django app,part4
编写你第一个Django app,part5
编写你第一个Django app,part6
高级:怎么编写可重复使用的apps
接下来做什么?
为你的Django程序编写第一个补丁
参考:如果你是一个python新手,你可能想要通过知道Django和什么语言相似。Django是纯python语言。所以如果你对python语言有一点点了解,你将更容易上手Django.
如果你是一个完完全全的编程新手,你可能想从“non-programmers python资源列表”开始。
如果你已经掌握了一些其它的编程语言,并且想快速手上python.我们建议从<<Dive into python>>(中文明是:《深入python》)。如果它不适合你,还有很多关于python的书,大家可以参考python官网。
来自 http://jingyan.baidu.com/article/6181c3e066701b152ef15330.html
1、下载django安装包。
django安装包,这个教程里使用是1.7.1的
下载django安装包可以到官网下载。这里就不贴地址了。
2、解压后,使用命令安装:
python setup.py install
注:python版本是:python3,django版本:django-1.7
如果你安装了两个python版本,那就要使用python setup.py install或者python3 setup.py install 如果你使用的是linux系统,也是一样的操作。
3、设置变量环境:
C:\Python34\Scripts;C:\Python34\Lib\site-packages\Django-1.7-py3.4.egg\django\bin;
如果在linux下面,一般是不要手动设置变量环境的。直接可以使用的。
来自 http://jingyan.baidu.com/article/db55b6099e7c0a4ba30a2f3e.html
这个小测试,用来测试Django的安装运行情况,也能教你简单的生成一个网站。在后面的章节中,还会详细讲解的。
创建一个项目:
django-admin.py startproject web1
创建一个APP
cd web1
manage.py startapp blog
初始化数据库
manage.py syncdb
然后根据提示填写。
Password填写后,不要会显示。
启动系统
manage.py runserver
在浏览器上输入:http://127.0.0.1:8000/
来自 http://jingyan.baidu.com/article/2d5afd69e213cc85a2e28e2a.html
django是使用python语言对象关系映射来设计数据库布局
数据模型语法提供丰富的表现模型的方法。代码如下:
from django.db import models
# Create your models here.
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length = 200)
content = models.TextField()
reporter = models.ForeignKey(Reporter)
def __str__(self):
return self.headline
接下来,运行Django命令自动创建数据为表格
python3 manage.py migrate
migrate命令着眼于所有有效models并创建不存在的数据表格。
来自 http://jingyan.baidu.com/article/574c52193f79f86c8d9dc12a.html
让我们从一个实例开始学习。
通过这个教程,我们将带你学习创建一个基础poll应用
这个教程由两部分组成:
发布一个网站,让别人访问polls和对他们投票。
一个管理后台,可以让你添加,更改和删除polls.
检测django版本
我们假设你已经安装了Django,可以通过下面的命令来测试Django版本。
>>> import django
>>> django.get_version()
'1.7'
如果你已经安装了Django,将会看到你安装在版本号。我用的是1.7的版本。如果没有安装,将会提示错误“No module named django”。
这个教程是适用Django1.7 和 python3.2或更高版本。如果Django版本不匹配,你可以参考你安装的教程,或者升级你的Django版本。
创建一个项目
如果这是你第一次使用Django,你将不得不细心安装。换句话说,你需要自动生成一些代码以便建立一个Django项目-并且设置Django,包括数据库,配置,Django特有的选项和应用设置。
cd到指定目录以便存放你的代码,然后运行下面命令:
django-admin.py startproject mysite
上面的命令在你当前目录将创建一个mysite目录,如果没有成功运行,可以参考Problems running django-admin.py.
NOTE:
项目必须避免使用django和python组件名。
创建的项目文件如下:
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
wsgi.py
数据库设置
打开mysite/mysite/setting.py文件找到下面这段代码
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
如果使用sqlite3数据库,保持默认就可以了。
设置好后,我们在使用带数据库网站前,必须在数据库里创建表格。使用如下命令:
D:\python\www\mysite>python manage.py migrate
运行Django服务器
D:\python\www\mysite>python manage.py runserver
如果出现下面的这段文字,恭喜你,你的网站运行成功了。就可以在浏览器访问了。
Performing system checks...
System check identified no issues (0 silenced).
October 15, 2014 - 02:05:41
Django version 1.7, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
后记:实践是检验真理的唯一标准,多动手吧!!!
上面的内容都是我自己学习的记录,有什么不对的地方,请留言!一起讨论!
来自 http://jingyan.baidu.com/article/7908e85c7d7a40af481ad2de.html
在这一节主要讲应用的创建和models设置,这里非常重要,一定要认真学习哦。
创建app
D:\python\www\mysite>python3 manage.py startapp polls
应用polls的目录如下:
polls/
__init__.py
admin.py
migrations/
__init__.py
models.py
tests.py
views.py
编辑poll/models.py文件
from django.db import models
# Create your models here.
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
激活models
编辑mysite/settings.py,添加polls应用。
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls'
)
现在Django已经知道项目包括polls应用,运行如下命令:
D:\python\www\mysite>manage.py makemigrations polls
然后显示如下内容:
Migrations for 'polls':
0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
运行sqlmigrate命令可以返回SQL语句:
python3 manage.py sqlmigrate polls 0001
返回如下:
BEGIN;
CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
CREATE TABLE "polls_choice__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id"
integer NOT NULL REFERENCES "polls_question" ("id"));
INSERT INTO "polls_choice__new" ("id", "choice_text", "votes") SELECT "id", "cho
ice_text", "votes" FROM "polls_choice";
DROP TABLE "polls_choice";
ALTER TABLE "polls_choice__new" RENAME TO "polls_choice";
CREATE INDEX polls_choice_7aa0f6ee ON "polls_choice" ("question_id");
COMMIT;
现在运行migrate创建models表格。
python3 manage.py migrate
返回:
Operations to perform:
Apply all migrations: admin, auth, sessions, polls, contenttypes
Running migrations:
Applying polls.0001_initial... OK
如果要使用Django Shell,就必须使用下面的这个命令:
python3 manage.py shell
导入polls.models模块
from polls.models import Question, Choice
显示所有数据:
Question.objects.all()
导入时间模块
from django.utils import timezone
创建一个Question对象
q = Question(question_text="What's new?", pub_date=timezone.now())
保存对象到数据库,可以使用save()函数。
q.save()
现在数据库表格有一个ID字段。
7、通过对象属性引用来读取数据。
q.id
q.question_text
q.pub_date
再编辑polls/models.py,让数据对象有返回值。
import datetime
from django.db import models
from django.utils import timezone
# Create your models here.
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
class Choice(models.Model):
question = models.ForeignKey(Question)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
让models.py的修改写入到数据库,python manage.py migrate
让models.py的修改写入到数据库,使用如下命令:
python manage.py migrate
来自 http://jingyan.baidu.com/article/4f34706ed3c810e387b56dfa.html
重新运行python manage.py shell
1、首先要导入数据库模块
>>> from polls.models import Question, Choice
确定models.py已经添加__str__()函数,并且已经运行。
>>> Question.objects.all()
[<Question: What's up?>, <Question: What's new?>]
使用Question.objects.all(),可以返回数据表的数据。
Django提供丰富的数据库查询API,全部由关键字参数驱动。
>>> Question.objects.filter(id=1)
[<Question: What's up?>]
filter(id=1)用来筛选指定参数。
>>> Question.objects.filter(question_text__startswith='What')
[<Question: What's up?>, <Question: What's new?>]
question_text__startswith由两部分组成,字段:question_text 后缀关键字:__startswith.
question_text__startswith='What'作用是:筛选指定字段,以‘What’开头的内容。
通过主键查询是最普通的方式,所以Django提供了一种快捷方式,
下面的这个代码和Question.objects.get(id=1)
>>> Question.objects.get(pk=1)
<Question: What's up?>
确认我们自定义的方法was_published_recently()生效。
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
给Question添加几个选项,需要构建一个Choice对象,插入声明,添加选择到设置有效的选项,
并且返回新Choice对象。Django创建一套另一个类的ForeignKey relation.
>>> q = Question.objects.get(pk=1)
从关联对象设置中显示任意选项
>>> q.choice_set.all()
[]
创建3个选项
>>> q.choice_set.create(choice_text="not much",votes=0)
<Choice: not much>
>>> q.choice_set.create(choice_text="The sky",votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text="Just hacking again",votes=0)
Choice对象有一个API通道和Question对象关联。
>>> c.question
<Question: What's up?>
反过来亦然,Question对象获得一个通道到Choice对象
>>> q.choice_set.all()
通过count()函数可以取得选项数量。
>>> q.choice_set.count()
删除选项:
>>> q.choice_set.all()
在前面我们已经说了关于Django的基本设置和models的编写和高度,这里我们来看一下怎么创建一个Django后台帐号。
首先我们要新建一个用户名,用来登陆管理网站,可以使用如下命令:
python manage.py createsuperuser
输入想要使用的用户名:
Username (leave blank to use 'administrator'): user01
输入email:
Email address: (在这里输入你的自己的邮箱帐号)
输入密码,需要输入两次,并且输入密码时不会显示出来:
Password:
Password (again):
当两次密码都相同的时候,就会提示超级帐号创建成功。
Superuser created successfully.
运行服务:
python manage.py runserver
浏览器地址栏输入:http://127.0.0.1:8000/admin
上面的输入刚才新建的用户名和密码。
进入admin管理页面后,就可以看到默认的界面。在这里,我们可以添加一些自己的内容。
使用admin.site.register(Question)来注册模块,Dango能构建一个默认排列。通常,你想要自定义来排列admin样式。
#edit polls/admin.py
from django.contrib import admin
from polls.models import Question
class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text']
admin.site.register(Question, QuestionAdmin
通过上面代码的修改,可以看到,下面显示位置的改变。
仅仅两个参数并不能让人感到映像深刻,但是对很多字段的admin排列来说,选择一种合理的排列方式是非常重要的。
我们来再一次修改polls/admin.py文件。
你根据这个模式,创建一个admin对象模块,放置到admin.site.register()第二个对数。
#edit polls/admin.py
from django.contrib import admin
from polls.models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields':['question_text']}),
('Date information',{'fields':['pub_date']})
]
admin.site.register(Question, QuestionAdmin)
fieldsets的每个元组里面的第一个参数,是控件标题。就像下面的:Date information.
Django提供了一个"collapse"类来显示或隐藏一个控件,初始为收缩状态。如果有一个很长的列表,这个功能就非常有用。
#edit polls/admin.py
from django.contrib import admin
from polls.models import Question
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields':['question_text']}),
('Date information',{'fields':['pub_date'],'classes':['collapse']})
]
admin.site.register(Question, QuestionAdmin)
修改后,打开网页,你就可以看到多了一个按钮。
我们已经在管理页面添加了Question。但是Question有很多选项。现在管理页面还不能显示选择控件。
这里有两种方式可以解决这个问题。第一是注册Choice对象。
现在Django管理页面已经有一个"Choice"选项了。如图下:
在这个表单中,“Question”字段是一个包括数据库里的所有question选择框.Django知道,ForeignKey在admin代表一个<select>选择框。
绑定Choice对象到Question中。
上面的更改,Django认为是:Choice对象可以在Question管理页面被编辑。默认为3条选择记录。
代码生效后,运行后,就是上面图片上的样子,extra = 3 代表初始显示是3.
还有一个小问题,就是要翻很多屏。能不能横向排列了?Django的强大,就是这么牛,你只要改一下ChoiceInline类的里面的问题。
使用admin.TabularInline代替admin.StackedInline),显示就完全改变了。
来自 http://jingyan.baidu.com/article/2d5afd69e292cc85a2e28eab.html
在这一节,我们在上一节的基础上添加两个控件,一个是按日期筛选,另一个是查询。
再编辑polls/admin.py,加一行代码来改进Question列表,过滤要使用list_filter。
添加“Filter”边侧栏,可以让我们改变pub_date排序。
filter数据类型显示依赖于field类型,因为pub_date 是DateTimeField,Django能自动识别并适应选择“Today”,"past 7days","This month","This year".
让我们加入一行代码使其有搜索功能search_fields = ['question_text']。再编辑polls/admin.py
在列表最上面有一个搜索框,当在搜索框输入检索词的时候,Django将搜索question_text字段内容。也可以搜索多个字段内容。因为Django是使用LIKE查询,限制搜索字段的数目的一个原因是数字将使数据库搜索更容易。
默认每页显示100条
来自 http://jingyan.baidu.com/article/ca2d939d2350adeb6c31ceab.html
虽然改变外观是很容易的,但可以使用Django自带的模板系统。Django管理本身就很强大,他的接口使用的是Django自己的模板系统。
自定义项目模板
在项目目录中创建一个templates目录,Django能接受templates能放到你系统的任何地方。然而把templates目录放到项目目录是一个很明智的选择。
打开mysite/settings.py文件,添加一个TEMPLATE_DIRS设置:
TEMPLATE_DIRS 是一个迭代系统目录,用来检测Django的模块,是一个搜索目录。
现在在 templates目录中新建一个admin文件夹。把目录C:\Python34\Lib\site-packages\Django-1.7- py3.4.egg\django\contrib\admin\templates\admin中的base_site.html文件,复制到工程目录 下面的\templates\admin。
注:如果亲很难找到Django的源文件,那就运行下面的代码:
然后,编辑base_site.html文件,找到下面这段代码:
{{ site_header|default:_('Django administration') }}
再用Polls Administration替换掉。换了之后的代码如下: Polls Administration
完整代码如下:
我们用这个方法告诉你怎么重写模块,在真实的项目中,你可能使用django.contrib.admin.AdminSite.site_header 属性来更轻松完成这个特殊制定。
这 个模板文件包含很多内容,如:{% block branding %} 和 {{ title }};{% 和{{都是Django的一部分的模块语言。当Django渲染admin/base_site.html时,这种模板语言将生成最终的THML页面,如 果你现在还不是很了解这种语言,没有关系,我们会在一下节中讲解。
任何Django默认admin模块都可以被重写,要重写模板,只要作上面相同的事就可以了。
自定义你的APP的模板
机敏的读者可能会问:默认的TEMPLATE_DIR是空的,那Django是怎样找到默认的 admin模板。答案是,默认情况,Django自动查找目录/templates/子目录里面的每个应用包,作为后备。(不要忘记 django.contrib.admin也是一个应用)
我们的polls应用并不是一个复杂的应用,没有必要自定义admin模板。但是如果这是一个更复杂和需要修改Django标准admin模板和一些方法。更明智的方法就是修改应用模板。
自定义admin index页面
和上面相似,你也想自定义admin index页面。
默认情况,在INSTALLED_APPS显示所有的app,admin应用已经按照字母顺序被注册好了。你可能想对布局做显著变化。毕竟,index是admin最重要的页面,它应该具有易用性。
自定义admin/index.html模板页面。(和前面重写admin/base_site.html模板是一样的,从默认目录复制到自定义模板页面中),编辑文件,你将看到它使用一模板变量:app_list.这个变量包括每一个已经安装的app.
来自 http://jingyan.baidu.com/article/4b07be3c6e3f2548b380f3ab.html
view作用是什么了?在这一节就会慢慢了解!我们在这一节,开始把内容显示到前台页面中。
打开polls/views.py,代码如下:
这是一个简单的view.
调用view文件,我们要映射到URL。但因为这个,我们需要一个URL配置文件。
我们在polls目录里新建一个URL配置文件,urls.py。
在polls/urls.py文件包括如下代码:
下一部就是要配置主mysite/urls.py文件,
现在你可以在浏览器的地址栏里输入:http://localhost:8000/polls/ ,就可以看到网页上显示:“Hello,world.you're at the polls index.”,这就是你在views中定义的。
url() argument:regex
"regex"是一个常用正则表达式,他是用来匹配字符串的。在这个项目中,url复写。
url() argument:view
当Django找到一个表达式匹配的时候,它便会调用一个特定的方法,使用一个HttpRequest对象作为第一个参数并且捕获从正则表达式传过来的值。
来自 http://jingyan.baidu.com/article/09ea3ede392194c0afde3947.html
进一步完善views,并使用urls做映射。这一节很重要,详细了解网址的方式。
现在我们在polls/views.py添加更多的代码。这些views稍微有些不同,因为他们带了一个参数。
现在来设置polls/urls.py文件。
在你的浏览器看一下,
在“/polls/5/”,它将运行detail方法,并且显示你在地址栏里提供的任何ID,再试试:“/polls/5/results/” 和“/polls/5/vote/”。这些将显示results和vote页面的占位符。
当 有人从你的网站上请求一个页面,“/polls/5/”,Django将加载mysite.urls Python模块,因为它指向你的ROOT_URLCONF设置。它会找到一个变量名为urlpatterns和有次序的正则表达式。使用 include()方法来简单的引用其它URLconfs.在include()里面的正则表达式,不要用$符号,但是需要一个”/“符号。
include() 的理念是使URLS更开放。自从polls是在它自己的URLconf设置(polls/urls.py),它们可以放置在”/polls“,或者 是”fun_polls“,又或者是”/content/polls“,又或者是其它根目录下,app仍然可以正常工作。
当用户访问”/polls/5/“,系统将发生了什么?
Django将查找匹配‘^polls/’
然 后去掉相匹配文本("polls/")然后发送剩下文本-”5/“-到”polls.urls“设置作为更进一步的匹配 r'^(?P<question_id>\d+)/$'结果调用detail()方法detail(request=< HttpRequest object>, question_id='34')
question_id='5',就来自(?P<question_id>\d+)。
来自 http://jingyan.baidu.com/article/dca1fa6fabc31df1a5405247.html
每一个view都负责做一个二选一的事情:返回一个HttpResponse对象包含请求页面的内容。或者引发HTTP404异常,剩下的就看你自己了。
view可以从数据库里读取记录。它可以使用像Django这样的模板系统或者第三方PYTHON模板系统。它可以生成一个PDF文件,输出XML,在忙碌的时候新建一个ZIP文件,使用python库做所有你想做的事情。
Django需求是HttpResponse.或者是异常处理。
因为它非常方便,现在我们使用Django自己的数据库API,在前我们已经讲过一些了,这里我们是目标是一个新的index()view.让它显示系统中最近5条poll问题,并根据发布日期用逗号分隔。
编辑:polls/views.py
这里有一个问题,页面设计是在view中使用的是硬编代码。如果你想改变页面的展现方式,你将必须重新编辑python代码。让我们使用Django的模板系统来分离python代码和设计。
在templates目录里创建一个polls子目录。再在polls目录里新建一个文件index.html。换句话说,模板 在:polls/templates/polls/index.html。因为app_directories模板怎样加载工作在上面已经描述。你可以参 考Django的下面的模板:polls/templates/polls/index.html
现在我们要更新一下polls/views.py里面的index方法,以便使用模板。
上面的代码加载模板调用:polls/index.html.并且传递它的内容。内容是一个python对象模板变量的字典映射。
通过在你的浏览器里的“/polls/”加载页面,你将可以看到页面显示的内容。并且超链接到detail页面。
加载一个模板是一个非常常用的词,填充内容返回一个HttpResponse对象的结果返回渲染模板。Django提供了一个简短的方法。下面我们在view重新写一下index()方法:
NOTE:一旦我们像这样完成了views里面的内容,就不再需要导入loader,RequestContext和HttpResponse,不过在这里,我们还要保持HttpResponse,因为detail,results,vote方法还需要使用。
render()方法使用request对象做为它的第一个参数,模板名字为第二个参数,在这里使用的是:“/polls/index.html”,一个字典做为第三个参数。它返回一个渲染好的内容的模板的HttpResponse对象
来自 http://jingyan.baidu.com/article/e52e3615aa279740c70c5147.html
每一个程序,都需要处理异常,虽然异常在语言中有一部分已经处理了,但是为了更友好,更方便,我们可以自己来处理,那django就是怎么处理的了?
现在我们来处理view.py中的detail方法。用来显示具体的问题。
这里有一个新的概念,如果question对象需要的ID不存在,view就会抛出一个Http404异常。
我们将在后面讨论polls/detail.html模板,但如果你想快速的让你的写的代码工作起来,在polls/templates/polls/detail.html文件下面编辑一下:
一个精简的方法:get_object_or_404(),在这里要导入模块:get_object_or_404,我们来重新写detail()方法:
get_object_or_404()方法的第一个参数是Question对象,第二个参数是从地址栏传递过来的的任意数字。
来自 http://jingyan.baidu.com/article/d71306350c6c3813fcf47576.html
来自 http://jingyan.baidu.com/article/b0b63dbfc708994a49307076.html