简单无脑的Django起步,适合最新版

字数 3205阅读 449

# 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')

```

推荐阅读更多精彩内容