Django学习资源
https://code.ziqiangxuetang.com/learn_share/django-learn-resource.html
Django 2.x学习
第一篇
Python新手学 Django 2.0 架构的16堂课
第一课 网站开发环境建立
概念
1、MVC(Model View Controller):Django 通过MVC概念把视图和控制逻辑分割开来,让程序设计人员可以尽量不用担心网站通信协议的繁琐细节而专心于要简历的网站功能。
2、virtuallenv设置管理python 的虚拟机环境
- pip install virtualenv
- virtualenv VENV
- source VENV/bin/activate
3、
第二课 Django网站快速入门
1、创建项目
#使用独立的虚拟python 运行环境
(1)创建专用的文件夹:mkdir Django_mblog
(2)在此Django_mblog目录下: source VENV/bin/activate
(3)安装python Django环境:
(VENV)$ pip install django
(VENV)$ django-admin startproject mblog
(VENV)$ cd mblog
(VENV)$ git init
(VENV)$ git add .
(VENV)$ git commit -m 'first commit'
(VENV)$ git remote add origin https://YuanQiLvXi@bitbucket.org/YuanQiLvXi/mblog.git
(VENV)$ git push origin master
(VENV)$ python manage.py startapp mainsite
(VENV)$ python manage.py migrate
Django 文件夹与文件解析
manage.py
manage.py 是Django 用来管理网站配置的文件,是一个接受命令行指令的工具程序,Django所有命令都是运行在此程序,平时不会修改它。
setting.py
是此网站的系统设置所在的位置,新创建的网站都要先打开这个文件,进行编辑设置的操作。真正的网站所有运行的逻辑都是在使用startapp 创建出来app文件中,使用这样的方式是让网站的每个主要功能都称为一个单独的模块,方便网站的开发者在不同的网站中重复使用
# 添加创建的app模块
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'APP_NAME'
]
# 修改时区
LANGUAGE_CODE = 'zh-CN'
TIME_ZONE = 'Asia/shanghai'
USE_TZ = False
#修改访问地址
ALLOWED_HOSTS = ['*']
urls.py
用来设置每一个URL的网址要对应的函数以及对应的方式
2、创建博客数据表
(1)数据库与Django的关系
在默认情况下,Django的数据库是以model的方式来操作的,也就是在程序中不直接面对数据库以及数据表,而是以class类先创建好的model,然后通过对model的操作达到操作数据库的目的。定义一个数据类来作为数据表,
(2)Django使用数据库的操作步骤
- 在models.py中定义需要使用的类(继承自models.Model)
- 详细地设置每一个在类中的变量,即数据表中的每一个字段
- 使用python manage.py makemigrations APP_NAME 创建数据库和Django间的中介文件
- 使用python manage.py migrate 同步更新数据库的内容
- 在程序中使用python 的方法操作所定义的数据类,等于是在操作数据库中的数据表。
(3)定义数据类型
修改mainsite/models.py的内容,添加数据表
from django.db import models
from django.utils import timezone
# Create your models here.
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.CharField(max_length=200)
body = models.TextField()
pub_date = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ('-pub_date',)
def __str__(self):
return self.title
在models.py中创建一个类,到时会在数据库中有一个对应的数据表. title 用来显示文档的标题,slug是文章的网址,body是文章的内容,pub_date是发布的时间。
class Meta 内的设置要指定文章显示的顺序是以pub_date为依据
__str__ 提供此类所产生的数据项
问题1、Django中的模块
问题2、model.py 格式
问题3、Django如何连接mysql 之类的数据库
django中ORM模型建立步骤
- 建立一张表(在数据库中,手动)
- 在django中配置数据库
- 新建app
- 将app添加到installed_apps列表中
- 写模型(类的形式)
- 映射到数据库中
(4)启动admin管理界面
admin是Django默认的数据库内容管理界面。
- 创建管理员账号和密码: python manage.py createsuperuser
- 将mainsite/module.py中自定义的数据表加入admin,并通过admin.site.register()来设置注册登录
vim mainsite/admin.py
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
python manage.py makemigrations mainsite
python manage.py migrate
- 启动: python manage.py runserver 0.0.0.0:8080 http://192.168.206.130:8080/admin
至51
一、Django 基础介绍
1、Django特点
- 强大的数据库功能 :数据库操作接口QuerySet API,如需也能执行原生SQL
- 自带强大后台:几行简单的代码就能让网站拥有强大的后台
- 优雅的网址:用正在匹配网址,传递到对应函数,随意定义,如你所想
- 强大的模板系统:
- 缓存系统:可与redis,memcached等缓存系统联用
- 国际化:支持多语言应用
2、Django全貌
- urls.py:网址入口,关联到对应的views.py中的一个函数(或generic类),访问网址就对应一个函数
- views.py:处理用户发出的请求,从urls.py中对应过来,通过渲染templates中的网页可以将显示内容,比如登录后的用户名,用户请求的数据,输出到网页
- models.py:与数据库操作相关,存入或去读数据是用到
- forms.py:表单,用户在浏览器上输入数据提交,对数据的校验工作以及输入框的生成等工作
- templates文件夹:views.py中的函数渲染templates中的html模板,得到动态内容的网页,可以用缓存来提高速度
- admin.py:后台
- settinspy:Django的设置,配置文件,比如DEBUG的开关,静态文件位置等
二、Django环境搭建
Django 2.0.x 支持 Python 3.4, 3.5 和 3.6 (最后一个支持 Python 3.4 的版本)
Django 2.1.x 支持 Python 3.5, 3.6 和 3.7
Django 2.2.x 支持 Python 3.5, 3.6 和 3.7 (LTS 长期支持版本)
1、升级python版本
(1)环境准备
gcc gcc-c++库安装:yum install -y gcc gcc-c++
zlib zlib-devel 库安装: yum install -y zlib zlib-devel
(2)下载python 3.6 压缩包
wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
tar -zxf Python-3.6.6.tgz
(3)编译安装
cd Python-3.6.6
./configure --prefix=/usr/local/python3 --with-ssl
make && make install
(4)将/usr/bin下python 的软连接 重新连接到python3
ln -fs python3 python
2 、安装 pip
更新源 sudo yum -y install epel-release
安装 sudo yum -y install python-pip python3-pip
更新到最新版本: sudo pip install --upgrade pip
3、安装Django
pip3 install Django==2.2.7
检查是否安装成功:import django
django.get_version()
三、Django 基本命令
- 新建Django project:django-admin.py startproject project_name
- 新建app:进入项目目录下,cd project_name然后执行命令
python manage.py startapp app_name
或 django-admin.py startapp app_name
# 一般一个项目有多个app,通用的app也可以在多个项目中使用
- 创建数据库表与更改
创建更改的文件:python manage.py makemigrations
生成的py文件应用到数据库:python manage.py migrate
这种方法可以在SQL等数据库中创建与models.py代码对应的表,不需要自己手动执行SQL
问题:django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17)
解决:更新sqlite版本
- 使用开发服务器
指定端口: python manage.py runserver PORT_NUM
监听机器所有可用的ip: python manage.py runserver 0.0.0.0:8000
问题1:You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
解决:配置migrate:python manage.py migrate
问题2:运行django项目出现Invalid HTTP_HOST header: '192.168.1.111:8000'. You may need to add '192.168.1.111' to ALLOWED_HOSTS
解决:在我们创建的项目里修改setting.py文件
ALLOWED_HOSTS = ['*'] #在这里请求的host添加了*
- 清空数据库
python manage.py flush #此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。
- 创建超级管理员
python manage.py createsuperuser #按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
# 修改 用户密码可以用:
python manage.py changepassword username
- 导出数据与导入数据
导出数据:python manage.py dumpdata appname > appname.json
导出数据:python manage.py loaddata appname.json
- Django 项目终端 -- 熟练掌握
python manage.py shell
如果你安装了 bpython 或 ipython 会自动用它们的界面,推荐安装 bpython。
这个命令和 直接运行 python 或 bpython 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据,还有一些小测试非常方便
问题1: 安装bpython
解决: pip3 install -i https://pypi.douban.com/simple/ bpython
- 数据库命令行
python manage.py dbshell
- 更多命令
终端上输入 python manage.py 可以看到详细的列表,在忘记子名称的时候特别有用。
四、Django 正式开始
1、Django 视图与网址
Django中网址是写在 urls.py 文件中,用正则表达式对应 views.py 中的一个函数(或者generic类)
(1)创建mysite项目
django-admin startproject mysit
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
(2)新建一个应用(app),名称叫learn
python3 manage.py startapp learn
mysite中多一个learn文件夹
learn
├── __init__.py
├── admin.py 后台相关的设置
├── apps.py app相关的设置文件
├── migrations 数据库变更相关
│ └── __init__.py
├── models.py 数据库模型相关
├── tests.py 单元测试
└── views.py 视图逻辑
(3)把新定义的app加到settings.py中的INSTALL_APPS中
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'learn', # 注意添加了这一行
]
新建的 app 如果不加到 INSTALL_APPS 中的话, django 就不能自动找到app中的模板文件(app-name/templates/下的文件)和静态文件(app-name/static/中的文件)
(4)定义视图函数(访问页面时的内容)
我们在learn这个目录中,把views.py打开,修改其中的源代码,改成下面的
from django.http import HttpResponse
def index(request):
return HttpResponse("欢迎光临 自强学堂!")
第一行引入HttpResponse,它是用来向网页返回内容的,就像Python中的 print 一样,只不过 HttpResponse 是把内容显示到网页上
我们定义了一个index()函数,第一个参数必须是 request,与网页发来的请求有关,request 变量里面包含get或post的内容,用户浏览器,系统等信息在里面
函数返回了一个 HttpResponse 对象,可以经过一些处理,最终显示几个字到网页上
问题:那问题来了,我们访问什么网址才能看到刚才写的这个函数呢?怎么让网址和函数关联起来呢?
(5)定义视图函数相关的URL(即规定 访问什么网址对应什么内容)
打开 mysite/mysite/urls.py 这个文件, 修改其中的代码:
from django.contrib import admin
from django.urls import path
from learn import views as learn_views # new
urlpatterns = [
path("", learn_views.index), # new
path('admin/', admin.site.urls),
]
https://docs.djangoproject.com/en/2.2/topics/http/urls/
(6)在网页上做加减法
- 采用/add/?a=4&b=5方式
创建project
创建app
将app加入到settings.py中
编写app目录下的views.py
from django.http import HttpResponse
def add(request):
a = request.GET['a']
b = request.GET['b']
c = int(a)+int(b)
return HttpResponse(str(c))
在urls.py 中添加此views
from calc import views as calc_views
urlpatterns = [
url('^add/', calc_views.add, name='add'), # 注意修改了这一行
url('^admin/', admin.site.urls),
]
打开开发服务器访问:python manage.py runserver 0.0.0.0:8001
http://192.168.206.130:8001/add/?a=4&b=5
- 采用/add/3/4
其他跟上面一样
---------------------------------------------------------------
问题:path('add/', calc_views.add, name='add') 这里的name='add'是用来干什么的
简单说,name 可以用于在 templates, models, views ……中得到对应的网址,相当于“给网址取了个名字”,只要这个名字不变,网址变了也能通过名字获取到。
2、Django模板
Django模板查找机制:Django查抄模板的过程式在每个app的templates文件中找(而不只是当前app中的代码只在当前的app的templates文件中找)。各个app的templates形成一个文件夹列表,Django遍历这个列表,一个个文件夹进行查找,当在某个文件夹找到的时候就停止,所有都遍历完了还找不到指定的模板的时候就会Template Not Found。
Django模板中的循环,条件判断,常用的标签,过滤器:
(1)创建新项目
(2)在learn/views.py写一个首页的视图
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
(3)在 learn目录下新建一个 templates 文件夹,里面新建一个 home.html
默认配置下,Django 的模板系统会自动找到app下面的templates文件夹中的模板文件。
zqxt_tmpl
├── learn
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── templates
│ │ └── home.html
│ ├── tests.py
│ └── views.py
├── manage.py
└── zqxt_tmpl
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ └── settings.cpython-37.pyc
├── settings.py
├── urls.py
└── wsgi.py
(4)编写home.html
<!DOCTYPE html>
<html>
<head>
<title>欢迎光临</title>
</head>
<body>
欢迎光临自强学堂
</body>
</html>
(5)将视图函数对应到网址。zqxt_tmpl/urls.py
from django.contrib import admin
from django.urls import path
from learn import views as learn_views # new
urlpatterns = [
path('', learn_views.home, name="home"), # new
path('admin/', admin.site.urls),
]
(6)创建数据库表
python manage.py migrate
(7)网站模板的设计,可以写一个base.html来包含这些通用模板.
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默认标题{% endblock %} - 自强学堂</title>
</head>
<body>
{% include 'nav.html' %}
{% block content %}
<div>这里是默认内容,所有继承自这个模板的,如果不覆盖就显示这里的默认内容。</div>
{% endblock %}
{% include 'bottom.html' %}
{% include 'tongji.html' %}
</body>
</html>
- 如果需要,写足够的block({% block content %}<div> </div> {% endblock %})以便让继承的模板可以重写该部分,include 是包含其它文件的内容,就是把一些网页共用的部分拿出来,重复利用