django notes
简介
urls.py 网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。
views.py 处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。
models.py 与数据库操作相关,存入或读取数据时用到这个,当然用不到数据库的时候 你可以不使用。
forms.py 表单,用户在浏览器上输入数据提交,对数据的验证工作以及输入框的生成等工作,当然你也可以不使用。
templates older
views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,当然可以用缓存来提高速度。
admin.py 后台,可以用很少量的代码就拥有一个强大的后台。
settings.py Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等。
安装
1. 安装
Django版本众多,兼容性差。指定版本安装 pip install django==1.10.6.
2. 检查安装
cmd>python
进入python
import django
不报错,安装成功
print(django.get_version())
打印版本信息
build the first aproject
1. create
django-admin startproject yeeblog
终端执行建立工程文件夹-project
2. 目录说明
- HelloWorld: 项目的容器。
- manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
- HelloWorld/init.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
- HelloWorld/settings.py: 该 Django 项目的设置/配置。
- HelloWorld/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
- HelloWorld/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。
3. 开启服务器
python manage.py runserver # 开启服务器
python manage.py runserver 8001 #使用其它端口,ctrl+C退出
python manage.py runserver 0.0.0.0:8000
python manage.py runserver 0.0.0.0:80
#监听机器上所有ip 8000端口,访问时用电脑的ip代替 127.0.0.1
ctrl+c //终止
build first app
python manage.py startapp firstapp
多了一个firstapp文件
#文件结构
learn/
|--migrations
├── __init__.py
├── admin.py
├── models.py
├── tests.py
└── views.py
|-- apps.py
- 把新定义的app注册到settings.py的INSTALL_APPS
- 修改views文件,自定义显示
- 修改视图函数相关url
加法实例
#views.py
def add(request):
a=request.GET['a']
b=request.GET['b']
c=int(a)+int(b)
return HttpResponse(str(c))
#urls.py
url(r'^add/$',first_views.add,name='add'),
#net
http://127.0.0.1:8000/add/?a=4&b=5
基本命令
python manage.py startapp app-name
#新建app
python manage.py syncdb
#同步数据库
'''
注意:Django 1.7.1及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate
'''
python manage.py flush
#清空数据库
python manage.py createsuperuser
'''
创建超级管理员
按照提示输入用户名和密码,邮箱可以留空
python manage.py changepassword username #修改用户密码
'''
python manage.py dumdata appname > appname.json
python manage.py loaddata appname.json
#导入导出数据
python manage.py shell
#终端运行
python manage.py dbshell
#数据库命令行
python manage.py
#命令详解
URL
html url path
"/index/": 表示绝对路径
“index/”: 表示相对路径
url解析
#reverse()
def get_absolute_url(self):
return reverse('myfirstapp:detail',kwargs={'pk':self.pk})
#html文件中解析,可以传入参数
{% url 'myfirstapp:archives' date.year date.month %}
#避免使用硬编码,方便修改
templates
describes how Django will load and render templates
基本用法
- 在appname下新建templates文件夹/或者在根项目下建立模板
- templates下放要引用的html文件,
. - views.py
# -*- coding: utf-8 -*-
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
进阶
1. 传递字符串
#定义
def home(request):
string=u"hello"
return render(request,'home.html',{'string':string})
#引用
{{string}} #home.html
2. for循环,列表,字典
#定义
def home(request):
tutor=["Html","CSS","Python"]
return render(request,'home.html',{'tutor',tutor})
#引用
{% for i in tutor %} #功能语句%%
{{i}} #变量用{{}}
{% endfor %}
#字典引用
{{dict.key}}
or
{%for key,value in dict %}
{{key}}:{{value}}
{% endfor %}
3.for循环高阶操作
#嵌套格式
{% for items in list%}
{{item}}
{%if not <>%}
<do>
{% endif %}
{% endfor %}
变量 描述 forloop.counter 索引从 1 开始算 forloop.counter0 索引从 0 开始算 forloop.revcounter 索引从最大长度到 1 forloop.revcounter0 索引从最大长度到 0 forloop.first 当遍历的元素为第一项时为真 forloop.last 当遍历的元素为最后一项时为真 forloop.parentloop 用在嵌套的 for 循环中,获取上一层 for 循环的 forloop empty 判断为空元素
4. 获取用户信息
{{request.user}}
{{request.path}}
{{request.GET.urlencode}}
model
- 每个模型都是django.db.models.Model 的一个Python 子类
- 模型的每个属性都表示为数据库中的一个字段
- Django 提供一套自动生成的用于数据库访问的API
数据库配置
#settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # or mysql.connector.django
'NAME': 'myblog',
'USER': 'root',
'PASSWORD': '1225',
'HOST':'localhost',
'PORT':'3306',
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
pip install mysqlclient #install mysql驱动
import mysqldb #检验是否安装
def model
修改app/models.py
from django.db import models
class Persons(models.Model): #继承自models.models
name = models.CharField(max_length=30)
age = models.IntegerField()
"""
由于分类名和标签名一般都是用字符串表示,因此我们使用了 CharField 来指定 name 的数据类型,同时 max_length 参数则指定 name 的最大长度。除了 CharField ,django 还为我们提供了更多内置的数据类型,比如时间类型 DateTimeField、整数类型 IntegerField 等等
dields字段类型官网文档
https://docs.djangoproject.com/en/dev/ref/models/fields/
"""
#生成数据库表
python manage.py makemigrations
python manage.py migrate
#之前要先打开数据库
模型实例化
实例
python manage.py shell #打开python交互命令行
from myapp.models import Persons #导入类实例
p1=Person(name="Yeekal",age=22) #create
p1.save() #save to databases
p2=Person.objects.create(name="Haley",age=19) #一次完成创建和保存
1. Person.objects.create(name=name,age=age)
2. p = Person(name="WZ", age=23)
p.save()
3. p = Person(name="TWZ")
p.age = 23
p.save()
4. Person.objects.get_or_create(name="WZT", age=23)
5. p.delete()
"""
这种方法是防止重复很好的方法,但是速度要相对慢些,返回一个元组,第一个为Person对象,第二个为True或False, 新建时返回的是True, 已经存在时返回False.
"""
选择
p_list=Person.objects.all();
def __unicode__(self): #可视化
# 在Python3中使用 def __str__(self)
return self.name
过滤
-
Person.objects.all() 返回类似于列表的数据结构
-
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存
-
Person.objects.get(name=name)
get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
-
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
-
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件
-
Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
-
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写
-
Person.objects.filter(name__regex="^abc") # 正则表达式查询
-
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写
filter是找出满足条件的,当然也有排除符合某条件的
-
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
-
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的
创建用户
python manage.py createsuperuser
username:yee
password:
自定义Field
http://www.ziqiangxuetang.com/django/django-custom-field.html
queryset进阶
http://www.ziqiangxuetang.com/django/django-queryset-advance.html
进阶
后台
http://www.ziqiangxuetang.com/django/django-admin.html
python manage.py createsuperuser #创建超级管理员
#修改admin.py文件
from django.contrib import admin
from .models import Article
admin.site.register(Article)
#runserver就可以添加文章了
表单
- 新建app/forms.py
python
from django import forms
//继承自forms.form 或者 forms.ModelForm
class AddForm(forms.Form):
a = forms.IntegerField()
b = forms.IntegerField()
- views.py定义函数
静态文件
appname/static/appname---css
|---js
支持markdown
#第三方库
pip install markdown
#渲染文章主题
post.body=markdown.markdown(post.body,
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',#语法高亮
'markdown.extensions.toc',#自动生成目录
])
#引用时添加过滤器,否则只显示原始的html代码
{{post.body|safe}}
代码高亮
pip install pygments
#markdown引入扩展
extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',#语法高亮
'markdown.extensions.toc',#自动生成目录
])
//html文件引入代码高亮格式文件
<link rel="stylesheet" href="{% static 'blog/css/highlights/github.css' %}">
模板语法
static file
url
ali
3d
code
python manage.py createsuperuser
python manage.py runserver 0.0.0.0:8234
nohup python manage.py runserver 0.0.0.0:8234 1>/dev/null 2>1 &
python manage.py makemigrations
python manage.py migrate