一、创建python虚拟机并安装Django
解决同包不同版本的依赖问题,使用python虚拟机。在虚拟机中安装包,不影响实际环境中的包。
虚拟机实际上是复制了物理机上的python环境。
创建虚拟环境命令:
mkvirtualenv <虚拟环境名>
如创建python3虚拟环境:
mkvirtualenv -p python3 bj11_py3
进入虚拟环境工作:
workon <虚拟环境名>
查看机器上有多少个虚拟环境:
workon 空格 + 两个tab键
退出虚拟环境:
deactivate
删除虚拟环境:
rmvirtualenv <虚拟环境名>
虚拟环境下安装包的命令:
pip install 包名
注意:不能使用sudo pip install 包名,这个命令会把包安装到真实的主机环境上而不是安装到虚拟环境中。
查看虚拟环境中安装了哪些python包:
pip list
pip freeze
安装django环境:
pip install django==1.8.2
建立一个django项目步骤如下:
1.创建django项目
2.创建一个application
3.创建application之后,需要对这个application注册。即在setting.py中添加相应代码
在INSTALLED_APPS的末尾添加一行app的名字.
4.运行 python manage.py runserver
二、Django项目结构
Django遵循MVT架构
M:模型 与数据库交互
V:视图 接受请求,进行处理
T:模板 产生HTML页面
创建django项目
文件说明
__init__.py :说明这是一个python包
settings.py :项目的配置文件
url.py :进行url路由
wsgi.py :wsgi协议,web服务器和django交互的入口
manage.py :项目管理文件,通过该文件管理整个项目
创建application
文件说明
admin.py :建立应用与项目之间的联系,需要对应用进行注册。网站后台管理相关文件
models.py :和数据库交互模块
views.py :定义处理函数,视图函数,返回应答
tests.py :写测试代码的文件
数据库配置
三、创建模型
1.在应用的modles.py中编写模型类,继承models.Model类
class Book(models.Model):
name = models.CharField(max_length=20) #定义字符串格式,设置最大值
data = models.DateField #定义时间格式
number = models.IntegerField #定义整数格式
指定使用数据库中的哪个表,可在模型类中重写Meta类,该类用于指定表名:
class Meta:
db_table = '表名'
2.创建模型类后,执行命令生成迁移文件
python manage.py makemigrations
执行成功后,在app包下会多出一个migrations包
3.执行迁移生成表
python manege.py migrate
4.在adim.py下设置表管理员
admin.site.register(User_Info)
或
admin.site.register(User_Info,UserAdmin) 第二个参数表示由哪个用户管理,默认admin
四、通过模型类操作数据表、模型类数据库关系(model)
使用模型类对数据表CRUD
1.在app中的models导入models模块
from django.db import models
2.用模块类创建实例
b = Book()
3.对实例的属性赋值
b.name = "a book"
b.number = 23
4.调用实例的save属性,将内容写入数据库
b.save()
5.查询
模块类中的objects类的get方法可以查询符合条件的实例,并返回该实例。
b2 = Book.objects.get(id=1)
type(b2)
返回:AppTest.models.Book
可以查看b2的属性,如:
h1.book.name
返回: a book
修改属性后,调用save函数,可对数据库进行更新
6.删除
b.delete()
模型的关系
1.创建多类时,在多类中添加外键,外键值为一类的类名(表名),如:
class Hero():
name = models.CharField(max_length=20)
age = models.IntegerField()
#添加外键(django 2.0以上,需要加上on_delete,否则会报错)
book = models.ForeignKey("Book", on_delete=models.CASCADE)
2.创建实例
多类创建实例与一类基本相似,需要注意的是:
多累中的外键的参数是一个对象。即一类的实例。
3.查看关联的表属性
多类:创建多类实例后,该实例的外键属性是一个对象,该对象即一类的实例。故可用那个对象来获取一类实例中的属性。
一类:一类中查看所有相关的多类,用: 实例.多类名_set.all(),或 多类名_set.get() 。
注:类名默认小写
五、后台管理(model)
1.本地化(语言、时间)
修改项目下的setting.py文件
2.创建管理员
命令:
python manage.py createsuperuser
创建成功后,在 IP:PORT/admin 进入后台管理界面
3.注册模型类
在应用下的admin.py中注册模型类。
告诉djang框架根据注册的模型类来生成对应表管理页面。
4.自定义管理界面
管理界面默认显示:
如果需要使名字显示自定义的内容,则在模型类中重写__str__函数,该函数返回什么,这里就显示什么。如:
5.自定义管理界面
需在admin.py中写自定义管理模型类。类名可以自定义,如
class BookAdmin(admin.ModelAdmin):
list_display=['name','number']
注: list_display中写的字段即界面上显示的字段。
在admin.py中注册模型类时,参数中指定管理模型类,如:
admin.site.register(Book, BookAdmin)
注: 括号内第一个参数是模型类,第二个参数为管理模型类。
六、视图(view)配置与重定向
1配置应用中的urls.py
在项目下的urls.py中的urlpatterns列表中添加应用下的urls.py
导包:from django.conf.urls import include,url
语法:path('', include("AppTest.urls")), 或
url(r'^', include("AppTest.urls")),
path中有两个参数,第一个为访问时IP后的第一个字符,如admin。第二个参数为用include函数加应用下的urls.py。
2.配置应用下的urls.py
在应用下的urls.py中的urlpatterns列表写入路由,如:
语法:url(r'^index', views.index)
url中有两个参数,第一个参数是浏览器访问的页面,第二个参数为view.py中的函数。
3.定义视图函数,用于返回浏览器请求
在app的views.py内添加视图函数,参数为HttpRequest。需要返回HttpResponse()
from django.http import HttpResponse
def index(request):
return HttpResponse(.......)
注:页面跳转,如果访问一个页面时,要返回的是另一个页面的内容,则return时这样写:
return HttpResponseRedirect('/index')
表示让浏览器再去访问/index。
七、模板(html)
1.设置模板文件目录
在项目的setting.py里的TEMPLATES中的'DIRS'列表中添加模板路径(页面文件存放路径)
在setting.py中,默认有这个变量:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
即项目的绝对路径。可以通过该变量拼接相对路径,使项目移动后仍然可以找到模板文件。
故'DIRS'中可以这样写:
'DIRS': [os.path.join(BASE_DIR, 'templates')]
注:一般会在templates下新建一个与应用同名的文件夹,在该文件夹下存放对应应用的模板,以分隔应用模板。
2.使用模板文件
在视图函数中使用模板文件(views下的函数)
a)获取模板内容
temp = loader.get_template('python/index.html')
b)定义 上下文
#context = RequestContext(request,{})
context = {替换字典}
c)渲染模板
res_html = temp.render(context)
d)返回给浏览器
return HttpResponse(res_html)
但是django自带render函数,所以可以直接写成:
return render(request, "python/index.html", {"key":"value"})
参数中的字典可以对页面内容进行替换,在页面中用两个大括号把变量圈起来{ {}},然后key对应变量名,value为变量值,即可对页面进行修改。如:
return render(request, "python/index.html", {"context":"让我们来试一试"})
在页面中使用for循环,要用{%%},如:
{% for i in list %}
<li>{
{i}}<li>
{% endfor %}
注:不能直接用range,因为range是一个生成器,不是列表,需要在views中把李斯特替换成列表,如:
return render(request, "python/index.html", {"list":list(range(10))})
从数据库中读取信息并显示:
1.views.py
a)从模板中获取信息
book_list = Book.objects.all()
b)替换页面内容
return render(request,"book/index.html", {"book_list":book_list})
2.页面遍历
{% for book in book_list %}
{
{book}}
</br>
{% endfor %}
八、静态文件配置
1.在项目中创建static文件夹
2.修改setting.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR + "static")]
html上:
原先写法
{# <link rel="stylesheet" href="/static/css/reset.css"/>#}
不使用路径写法,方便settings改配置static写法
头前:
{% load staticfiles %}
头:
<link rel="stylesheet" href="{% static "css/reset.css" %}"/>
<link rel="stylesheet" href="{% static "css/navigation.css" %}"/>
<link rel="stylesheet" href="{% static "css/register.css" %}"/>
九、模板语言与过滤器
模板语言
1.模板变量
模板变量名是由数字,字母,下划线和点组成的,不能以下划线开头。
使用模板变量:{ {模板变量名}}
模板变量的解析顺序:
例如:{ { book.btitle }}
- 首先把book当成一个字典,把btitle当成键名,进行取值book['btitle']
- 把book当成一个对象,把btitle当成属性,进行取值book.btitle
- 把book当成一个对象,把btitle当成对象的方法,进行取值book.btitle
例如:{ {book.0}}
- 首先把book当成一个字典,把0当成键名,进行取值book[0]
- 把book当成一个列表,把0当成下标,进行取值book[0]
如果解析失败,则产生内容时用空字符串填充模板变量。
使用模板变量时,.前面的可能是一个字典,可能是一个对象,还可能是一个列表。
2 模板标签
{% 代码段 %}
for循环:
{% for x in 列表 %}
{
{循环内容}}
# 列表不为空时执行
{% empty %}
# 列表为空时执行
{% endfor %}
可以通过{ { forloop.counter }}得到for循环遍历到了第几次。
{% if 条件 %}
{% elif 条件 %}
{% else %}
{% endif %}
模板中支持逻辑运算,如:
关系比较操作符:> < >= <= == !=
注意:进行比较操作时,比较操作符两边必须有空格。
逻辑运算:not and or
3.模板注释
单行注释: {# 注释内容 #}
多行注释:
{% comment %}
注释内容
{% endcomment %}
过滤器
1.过滤器的使用
过滤器用于对模板变量进行操作。
date:改变日期的显示格式。
length:求长度。字符串,列表.
default:设置模板变量的默认值。
格式:
模板变量|过滤器:参数
如:
{
{book.date|date:'Y年-m月-d日'}}
2.自定义过滤器
- 在app下新建名为templatetags的python包。
- 在templatetags包中新建py文件,文件名不固定,例:filters.py
- 导包
from django.template import Library
4.创建Library对象
register = Library()
5.创建过滤器函数并装饰
#定义函数,进行装饰,装饰后即成为过滤器
@register.filter
def mod(num):
'''判断参数是否为偶数'''
return num%2 == 0
自定义的过滤器函数,至少有一个参数,最多两个。使用过滤器时,默认将 "|" 前的东西作为参数传给过滤器。
如果有两个参数,则默认将 | 前的东西作为第一个参数,在过滤器后面加 :,在 : 后面写第二个参数。如:
{
{book.date|date:'Y年-m月-d日'}}
模板继承
当多个页面都有相同内容时,可使用模板继承,将相同部分写进父模板中,子模板通过继承父模板获取父模板的内容。
子模板继承父模板时,用
{% extends '父模板路径' %}
父模板路径为相对templates路径。继承时,子模板中新建时默认包含的代码都要删去。且直接在子模板中写代码是无效的。
子模板需要写代码时,需要在父模板中先预留块。子模板再重写预留块。
在父模板里可以定义块,使用标签:
{% block 块名 %}
中间内容(块中间可以写内容,也可以不写)
{% endblock 块名%}
子模板去继承父模板之后,可以重写父模板中的某一块的内容。
继承格式:
{% extends 父模板文件路径%}
{% block 块名 %}
{
{ block.super}} #获取父模板中块的默认内容
重写的内容
{% endblock 块名%}
模板转义
在views.py中,使用render函数替换模板内容时,如果使用到<h1><h1>之类的标签时,传过去的是字符串,并不会变成标签。所以需要关闭html转义。
如:
在模板上下文中的html标记默认是会被转义的。
小于号< 转换为<
大于号> 转换为>
单引号' 转换为'
双引号" 转换为 "
与符号& 转换为 &
关闭方式:
1.使用过滤器
{
{ 模板变量|safe}}
2.过滤开关
{% autoescape off %}
模板语言代码
{% endautoescape %}