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

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

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容