-- 入门

# Django开发流程:
# 1.创建虚拟环境;
# 2.安装django;
# 3.创建项目;
# 4.创建应用;
# 5.在models.py中定义模型类,为视图提供数据;
# 6.定义视图,处理浏览器请求
# 7.配置URL
# 8.创建模板,呈现数据


-- 虚拟环境

# 针对python不同项目,而对应安装的一堆包的集合;
-- ubuntu中安装虚拟环境的命令(安装两个虚拟环境包,第二个是简易化操作)
    sudo pip install virtualenv
sudo pip install virtualenvwrapper  
-- 创建虚拟环境
mkvirtualenv 环境名称
mkvirtualenv py_django
-- 查看与使用虚拟环境
workon 两次tab键
workon py_django
-- 删除虚拟环境
rmvirtualenv 虚拟环境名称
先退出:deactivate
再删除:rmvirtualenv py_django
# 在创建虚拟环境过程中,在home目录下的.virtualenvs文件下,
# 会生成刚创建的虚拟环境,而且过程中系统会默认生成多个包,
# 以及将usr/bin/文件下的python文件复制到这个虚拟环境包里
# 的/bin文件下;
-- 查看当前所有的包
pip list 或者pip freeze
# 或者:~/.virtualenvs/py_django/lib/python2.7/site-packages下
# 查看所有的包
-- 虚拟环境下安装包
pip install 包名称
安装django1.8.2的包
pip install django==1.8.2

-- 创建项目(图书,英雄,一对多的关系)

# 在Desktop下创建,不会出现权限问题;
django-admin startproject 项目名称
--tree
-- manage.py 是项目运行入口,指定配置文件路径;
-- test1 包含项目的配置文件;
-- __init__表示这个目录当作包使用;
-- settings.py 是整体配置文件;
-- urls.py 是URL配置文件;
-- wsgi.py 是与WSGI兼容的web服务器入口;

-- 创建应用

python manage.py startapp booktest(应用名称)
-- booktest
-- admin.py
--__init__.py
-- migrations 
-- __init__.py
-- models.py  # 不许要手动到数据库中操作,直接在这个文件汇总添加类;
-- tests.py

-- 添加/安装应用

在test1/settings.py中INSTALLED_APPS下添加应用名称就可以安装;
'bootest';
# 开启服务器(同时生成一个sql数据库)
# python manage.py runserver ip:端口
# 1.ip可以不写;
# 2.默认端口为8000


-- 模型设计

-- 创建模型类

-- ORM框架 将python的对象转换成数据库中sql的操作;
# 通过自定义模型类和对象,完成对数据库的操作
-- 在manage.py中设置环境变量,用settings控制管理整个项目;(默认已经设置)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test1.settings")
-- models.py
# 定义类时,需要继承models.Model类;
# class BookInfo(models.Model):
btitle = models.CharField(max_length=20)  # 设置字符长度;
bpubdate = models.DateField()  # 设置日期格式;
# class HeroInfo(models.Model):
hname = models.CharField(max_length=20)
hcontent = models.CharField(max_length=100)
hgender = models.BooleanField(default=True)  # 设置布尔类型;
hbook = models.ForeignKey(BookInfo)  # 设置外键对象;
-- 查看迁移文件对应的sql语句
python manage.py sqlmigrate news 0001
-- 生成迁移文件(相当于生成sql语句,以及执行)
# 根据模型类与属性,确定表结构,生成文件;
# 执行迁移;
生成:python manage.py makemigrations(执行sql语句)
# 会在migrations文件下,0001_initial.py的文件,__init__.py
# 里面是类似于sql语句的代码;
执行:python manage.py migrate(创建表结构)
# 生成__init__.pyc文件

-- 使用模型类

-- 进入项目的shell,进行简单的API操作
python manage.py shell
# 在模块中引入类对象,再进行操作;
from booktest.models import BookInfo
-- 在shell下对数据进行增删改查(忽略)
BookInfo.objects.all()  # 查询所有;
# 创建对象
b=BookInfo()
b.title='射雕英雄传'
from datetime import date
b.pub_date=date(2017,1,1)
b.save()  # 保存数据;
# 创建/获取指定对象
b=BookInfo.objects.get(id=1)
b.title='神雕侠侣'
b.save()
...

-- 后台管理(CMS内容管理系统)

-- 创建管理员
-- 注册用户
python manage.py createsuperuser
# 用户名默认:python;密码:chuanzhi
-- 进入后台管理页面
# 修改界面语言(默认英文)
settings.py文件中修改成 LANGUAGE = 'zh-Hans';TIME_ZONE = 'Asia/Shanghai'
# 在.virtualenvs/py_django/lib/python2.7/site-packages/django/contrib/admin/locale/文件下
-- 启动服务器,浏览
python manage.py runserver
http://127.0.0.1:8000/admin
-- 注册 admin.py(注册模型类,将model.py创建的类引入后台)
引入模型类
from models import *
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
# str方法中,使用了中文,需要在models中str方法下的属性encode("utf-8")
-- 支持自定义(在后台显示所有属性,继承admin.ModelAdmin类)
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'title', 'pub_date']
class HeroInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'name', 'content', 'gender', 'book']
# 将添加属性的类添加到注册中;
admin.site.register(BookInfo, BookInfoAdmin)


--视图
-- 定义视图函数(接受request,返回HttpResponse)
# view
# 本质就是一个函数;
# 封装所有信息;
from django.http import HttpResponse
# 必须传入HttpRquest对象的request,返回HttpResonse对象;
def index(request):
return HttpResponse('hello world')
-- 配置URLconf(找到对应视图函数)
# 找到视图的过程:
# 用户在浏览器输入url地址,请求访问网站后,服务器后台接受到信息,
# 然后与写好的URLconf逐一匹配,如果匹配到就调用;没有就返回404错误;
-- URLconf 编写规则
1.使用正则表达式定义;
2.使用view.py中定义的视图
-- URLconf 配置过程
1.在自己创建的应用(booktest)中创建urls.py文件,配置URLconf,定义;
from django.conf.urls import url
from . import views
urlpatterns = [url(r'^$', view.index),] # view.index调用视图模块中定义的index函数;
2.在项目中的url.py,链接到应用的URLconf中;
url(r'^', include('booktest.urls')),
# 其完整代码
from django.conf.urls import include, url
from django.contreib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls))
url(r'^', include('booktest.urls')),
]
# 请求访问:127.0.0.1:8000

-- 模板

# 在Django中,将前端内容定义在模板中,再把模板交给视图调用;
-- 创建模板
# 在项目目录下创建模板文件夹templates,并在其中创建与应用
# 同名的文件存放模板文件;
-- 视图中寻找模板
-- 在settings.py中做设置,为了找到templates模板文件位置
'DIRS':[os.path.join(BASE_DIR, 'templates')],  # 拼接templates文件夹所在位置;
-- 在views.py中加载渲染模板
def index(request):
cag = NewsCategory.objects.get(pk=1) # pk(primary key)相当于Id
data = {'cag': cag.cag_name}
tpl = loader.get_template('index.html')
new_tpl = tpl.render(data)
return HttpResponse(new_tpl)
# 简写成一下操作: 
def index(request):
return render(request, 'booktest/index.html')