# Django学习笔记
![Django首页截图](images/django.jpg)
## 1. 安装
*~~目前支持从2.5(貌似)到最新的3.4的所有版本Python,所以建议走最高版本就好了,貌似最新版Python还自带了pip(一个python包管理工具,很好用,必备)。~~
*~~安装在pip下超级简单,就是`pip install django==1.7.5`,1.7.5是当前最新版本~~
*安装好以后,新建项目用:`django-admin.py startproject <项目名称>`,后,自动生成目录
*~~如果安装报错请先升级一下pip试试?pip install -U pip,stackoverflow看来的,如果提示无法下载,可以卸载掉pip,然后easy_install pip或者easy_install3 pip试试~~
~~`20170204日补充,可以直接用IDEA的Python包管理功能安装、更新,并且使用豆瓣的Python包源`~~
*直接用**python -m venv [虚拟环境目录名]**新建一套虚拟环境
*进入虚拟环境的`./Scripts/activate.bat`激活虚拟环境
*然后就用虚拟环境下的pip isntall django啦!(或者直接在Pycharm下新建虚拟环境和Django即可)
*然后用**django-admin startproject [项目目录名称]**来新建项目
*建立好以后,在项目目录下(会有一个manage.py文件)直接运行**python manage.py runserver**,能跑起来就说明装好了
### 1.1 设置为中文
在`project`的`seetings.py`中,将:
~~LANGUAGE_CODE = 'en-us'`修改成`LANGUAGE_CODE = 'zh-CN'`~~
*20170204更新:*现在的方式是改成:`LANGUAGR_CODE = 'zh-hans'`了,或者用命令:`django-admin.py makemessage -l zh_CN`(这个据说要gettext组件,Windows不自带装起来麻烦,建议直接第一个方法解决)
### 1.2 设置时区为东八区
## 2. 简单的用法
*记得还要新建app,进入目录以后输入`manage.py startapp APP_NAME`
*然后记得在`settings.py`中把自己的app加入进去
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'[app name]',
)
*打开自带的WEB服务器是:`python manage.py runserver`
*Tour360目录下(暂时设定项目目录是Tour360)urls.py 是路由功能
*视图模块需要自己创建 我设定是views.py(在新版中新建app以后views.py会自动产生了)
*路由的写法:其实里面的Examples可以参考
>\#url(r'^$','tour360.views.home',name='home'),
>\#url(r'^blog/',include('blog.urls')),
>url(r'^admin/',include(admin.site.urls)),
>url(r'^hello/',hello),
>url(r'^$',blank),
20170204再来一个urls.py范例:
```python
fromdjango.conf.urlsimporturl
fromdjango.contribimportadmin
#这个用到引用自己定义的app下的views视图
fromcms.viewsimport*
urlpatterns=[
url(r'^admin/', admin.site.urls),
url(r'^cms/', cms),#这个才是自己加的
]
```
*记得路由urls.py里面要import视图的库,例如我的视图是:`from tour360.views import *`
*一个视图功能必须返回一个HttpResponse
*参数在urls中的写法:`url(r'^hello/(\w+)/$',hello)`,用括号+正则的写法
*在处理的views里面,添加offset参数,例如:`Def hello(request,offset):`,其实offset可以随便变成别的变量名。如果有多个参数,你就继续加就好了,变量名自己定就行
***PS:参数始终是String型,就算是纯数字也是String型**
最简单的views.py的写法范例:
```python
fromdjango.httpimportHttpResponse
defindex(request):
returnHttpResponse("
Hello World!
")```
## 3. 静态文件
你的静态文件,现在Django生成好项目后,应该就默认为
```python
STATIC_URL='/static/'
```
了。你可以在任何APP下(记得不是Project,而是APP)下建立**static**目录,然后直接放今天文件到里面去,这样,你就可以直接调用这里面的文件。例如你在:*Project/APP/static/123.png*的话,你就可以直接用:*http://localhost/123.png*调用这个文件了。
## 4. 有用的组件
*目前主流的RESTFul框架:
### 4.5 定义数据模型
在app的models.py中,例子如下:
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()
#记得Python3要写__str__,这样才会显示名字,作为外键的时候才会显示名字,Python2要写__unicode__,如下:
def __str__(self):
return self.name
运行:`manage.py check`看看有什么问题
然后建立库表`manage.py migrate`
#### 4.5.1 如何定义一个多级数据结构
下面演示了一个多级数据结构,其实就是外键设定为**self**就可以了。
```python
# 多级分类的尝试
classMenuItem(models.Model):
name=models.CharField(max_length=50,verbose_name='名称')
orderID=models.IntegerField(verbose_name='排序顺序')
parentID=models.ForeignKey('self',null=True,blank=True,verbose_name='属于')
# 下面定义了如何在其它将本Model作为外键的模型中展示多级效果
def__str__(self):
parentName=str(self.parentID)
if(parentName=="None"):
parentName='根'
returnstr(parentName)+">"+str(self.name)
classMeta:
verbose_name='多级分类管理'
verbose_name_plural='多级分类管理'
```
#### 4.5.2 如何定义一个上传图片的结构
很简单,使用models.ImageField就好(这个功能需要Pillow支持,记得pip装)例如:
```python
# 画廊Model
classGallery(models.Model):
"""
包含了名字、描述、图片(文件)、链接
"""
name=models.CharField(max_length=50,verbose_name='名称')
description=models.CharField(max_length=200,verbose_name='描述')
imageFile=models.ImageField(verbose_name='图片文件')
link=models.URLField(verbose_name='链接地址')
def__str__(self):
returnself.name
classMeta:
verbose_name='画廊'
verbose_name_plural='画廊'
```
### 4.6 如果要变更数据库表结构
如果不是从头建立,而是新增或者修改表结构,需要这样执行命令:
```shell
# 首先生成修改数据库表变化的代码
manage.py makemigrations
# 然后再执行代码进行迁移
manage.py migrate
```
## 5. 管理后台
-20170204追加:django并没有自己建立用户表,所以如果没有进行生成表的操作,一定要先跑:
```shell
#建立相应的表
manage.py migrate
```
才行,否则跑下面的:manage.py createsuperuser 是会报错的!
*通过: http:///admin 进入,需要在serttings.py打开相关中间件和部件,不过默认是打开的。然后会要求用户账号,这个时候可以直接用:·python manager.py createsuperuser·,进入交互式的添加账号对话增加新的管理用户
*默认是系统自己的数据的管理(有两个库的管理,一个是用户账号什么的)
*如果要增加你自己的数据模型进去,则需要在app目录下的admin.py中:
```python
# 这个是import你自己的模型
frommysite.books.modelsimportPublisher, Author, Book
# 也可以走这样的,建议这样省事
frommysite.books.modelsimport*
fromdjango.contribimportadmin//这个是系统自动生成
admin.site.register(Publisher)//括号中是你自己的模型对象
admin.site.register(Author)//括号中是你自己的模型对象
admin.site.register(Book)//括号中是你自己的模型对象
```
*非必填字段请在models中设定好,例如:
>Class User(models.Model):
>>Name = models.CharField(max_length=20,blank=True)
*可以自定义在管理界面下的数据编辑、列表页面,方法是在admin.py中自己写一个管理的类,例如:
```Python
# 这加入管理端口设置
class MainMenuAdmin(admin.ModelAdmin):
list_display = ('id', 'name')
...
# 然后切记!在后面注册管理类别的时候要协商管理端口设置参数啊!不然出不来的!
admin.site.register(MainMenu, MainMenuAdmin)
```
>classMemberAdmin(admin.ModelAdmin):
>>list_display=('name','phone','email','QQ')
>classActorAgentInfo(models.Model):
>>id=models.IntegerField(blank=True,null=False,primary_key=True,verbose_name='编号')
>>status=models.IntegerField(blank=True,null=True,verbose_name='状态')
>>agent_type=models.IntegerField(blank=True,null=True,verbose_name='客户类型')
*在数据库描述字段中加入verbose_name可以让字段在后台admin管理端口中显示指定的名字
*然后,在注册到管理端口中的时候要多加入一个参数:·admin.site.register(Member,MemberAdmin)·,这样,在列表中就会显示name、phone、email、QQ这几个属性,很棒!
*如果要加入搜索条,可以:·search_fields = ('first_name', 'last_name')·,参数是能搜索的字段
*如果要加入过滤器,可以:·list_filter = ('publication_date')·
*本地化可以在Setting.py中的MIDDLEWARE_CLASSES中加入中间件:·'django.middleware.locale.LocaleMiddleware'·
*model admin里建一个field,根据现在表的连接链接到另一张表的编辑页面或filter页面(听别的人说暂时没有实验)
*如果新闻的 model 包含了 新闻分类 还有新闻内容 新闻内容 里头设置好了 外键 那么 admin 里头 list_display 可以直接指定新闻分类的哇 然后后台的界面中下拉菜单啥的直接帮你生成好了 ~~
### 5.1 如何定义后台管理中Model表的显示名字
就是在数据模型的Model中添加Meta类来定义
```python
# 一级栏目Model
classMainMenu(models.Model):
# 有名称和ID就行,别的以后再考虑
name=models.CharField(max_length=50,verbose_name='名称')
def__str__(self):
returnself.name
# 这个Meta类就是用来定义表名字的,plural是定义复数内容的名字,不然会在后面+s符号表示负数不好看
classMeta:
verbose_name='主菜单'
verbose_name_plural='主菜单'
```
### 5.2 如何修改Admin管理后台的标题、名字
在APP的admin.py中用AdminSite设定就好了
```python
fromdjango.contribimportadmin
# 设定后台管理的标题和名称
admin.AdminSite.site_header='系统管理后台'
admin.AdminSite.site_title='系统维护'
```
### 5.3 Admin后台管理整合可视化编辑器
#### 1. django-tinymce(这个最简单)
1.pip装django-tingmce
2.在settings.py中的INSTALLED_APPS加入下面代码:
```python
INSTALLED_APPS = (
...
'tinymce',
)
```
3.在urls.py中加入tingmce.urls的解析
```python
# 切记,默认是不导入include功能的,需要自己加啊
from django.conf.urls import url, include
urlpatterns = [
...
url(r'^tinymce', include('tinymce.urls')), #注意tinymce和urls之间是点不是逗号
]
```
4.在model中引用tingmce并且指定对应的字段:
```python
from django.db import models
from tinymce.models import HTMLField
class MyModel(models.Model):
...
content = HTMLField()
```
#### 2. django-summernote(这个好多了,带图片上传)
1.首先安装,`pip install django-summernote`
2.然后需要在`settings.py`
````python
# 首先需要在INSTALLED_APPS代码段设置中间件
INSTALLED_APPS = [
......# 省略
]
INSTALLED_APPS += ('django_summernote',) # 官方是这么写的,其实写在数组里面也可以
# 中间一堆省略的,直接来到文件最后,设置上传文件目录和summernote的显示文字字符集
# 本段是为summernote设定的上传文件目录,下面一行获取当前项目目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 上传文件的URL地址
MEDIA_URL = "/static/upload/"
# 上传文件保存的电脑文件系统上的绝对路径
MEDIA_ROOT = os.path.join(BASE_DIR+"/cms/static/upload/")
# SUmmernote设定成中文UI
SUMMERNOTE_CONFIG = {
'lang': 'zh-CN'
}
````
3.然后在urls.py里面设置,如下:
```python
# 除了url外还要引用include
from django.conf.urls import url, include
# 切记,include不是默认包含的
url(r'^summernote/', include('django_summernote.urls')),
```
4.到这里就可以重构了:
```shell
manage.py makemigrations
manage.py migrate
```
5.下面,针对admin后台只要简单的将要使用的对象的admin.ModelAdmin替换成SummernoteModelAdmin就可以了,例如下面的这个:
```python
# 首先一定记得要引用Summernote的admin
from django_summernote.admin import SummernoteModelAdmin
# 这里原来是 class SomeAdmin(admin.ModelAdmin)
class SomeAdmin(SummernoteModelAdmin):
list_display = ('title', 'content', 'create_time')
```
## 6. 当前项目采用的环境
*Python 2.7.x(pyodbc对python版本有要求)
*Django 1.7.6
*virtualenv(虚拟开发环境)
*Pyodbc(通过odbc调用sqlserver)
*Django-pyodbc(数据库后端,需要某个exe的支持库,需要easy_install+本地文件名在virtualenv下安装到虚拟环境)
*SqlServer2008
## 7. 使用多数据库 multiple databases
## 8. 模板的使用
### 8.1 模板的位置
模板文件默认放在**APP**目录下的`templates`目录中
### 8.2 如何在模板中包含其他html
```python
{%include'somehtml.html'%}
```
## 9. Model模型的查询
具体看代码:
```python
# 首先要导入模型的类
fromcms.modelsimportSomeModel
# 查询所有的
SomeModel.objects.all()
# 查询条件过滤
SomeModel.objects.filter(id=0)#这是等于的
SomtModel.objects.exclude(id=0)#这是不等于的! id!=0
# 查询字段是null的情况
SomeModel.objects.filter(parentID__isnull=True)
```
## 10. urls路由
### 1. 重定向
有几种写法,看下面的代码吧:
```python
fromdjango.httpimportHttpResponseRedirect
defgoto_url(request):
returnHttpResponseRedirect('http://www.google.com')
```