创建项目
创建项目
django-admin.py startproject first ## 创建名为first的项目
创建应用
python manage.py startapp blog ## 创建名为blog的app
应用创建完后要在settings.py里面INSTALLED_APPS将新创建的应用blog添加上
视图
url() 函数
在url.py文件里,可以接收四个参数,分别是两个必选参数:regex、view 和两个可选参数:kwargs、name
- regex: 正则表达式,与之匹配的 URL 会执行对应的第二个参数 view。
- view: 用于执行与正则表达式匹配的 URL 请求。
- kwargs: 视图使用的字典类型的参数。
- name: 用来反向获取 URL。
include()函数
include函数可以将app里面的url地址导入到项目url文件里
url(r'^blog/', include("blog.urls"))
模板标签
if标签
{% if %} 标签接受 and, or 或者 not 关键字来对多个变量做判断,或者对变量取反(not),但是不允许在同一个标签中同时使用 and 和 or 。系统不支持用圆括号来组合比较操作。
如果确实需要用到圆括号来组合表达逻辑式,考虑将它移到模板之外处理,然后以模板变量的形式传入。或者仅仅用嵌套的{% if %}标签替换
for标签
{% for %} 允许我们在一个序列上迭代
给标签增加一个 reversed 使得该列表被反向迭代:
{% for athlete in athlete_list reversed %}
...
{% endfor %}
forloop
在每个{% for %}循环里有一个称为forloop 的模板变量。这个变量有一些提示循环进度信息的属性。
forloop.counter 总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1。
{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
- forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。
- forloop.revcounter 是表示循环中剩余项的整型变量。 在循环初次执行时 forloop.revcounter 将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1。
- forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。 在第一次执行循环时,该变量会被置为序列的项的个数减1。
- forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为True
- forloop.last 是一个布尔值;在最后一次执行循环时被置为True
- forloop.parentloop 是一个指向当前循环的上一级循环的 forloop 对象的引用(在嵌套循环的情况下)。 例子在此:
{% for country in countries %}
<table>
{% for city in country.city_list %}
<tr>
<td>Country #{{ forloop.parentloop.counter }}</td>
<td>City #{{ forloop.counter }}</td>
<td>{{ city }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
ifequal/ifnotequal 标签
{% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值。
下面的例子比较两个模板变量 user 和 currentuser :
{% ifequal user currentuser %}
<h1>Welcome!</h1>
{% endifequal %}
和 {% if %} 类似, {% ifequal %} 支持可选的 {% else%} 标签:
{% ifequal section 'sitenews' %}
<h1>Site News</h1>
{% else %}
<h1>No News Here</h1>
{% endifequal %}
include标签
{% include %}
该标签允许在(模板中)包含其它的模板的内容。
标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。
下面的例子包含了 includes/nav.html 模板的内容:
{% include 'includes/nav.html' %}
block标签
{% block %} 标签告诉模板引擎,子模板可以重载这些部分。 每个{% block %}标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖。
csrf_token标签
django中自带了防止CSRF攻击的功能。
GET请求不需要CSRF认证,POST请求需要正确认证才能得到正确的返回结果。一般在POST表单中加入 {% csrf_token %}
<form method="POST" action="">
{% csrf_token %}
<input name="" value="">
</form>
模型
mysql数据库设置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': 'root',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
数据模型
每个数据模型都是 django.db.models.Model 的子类。它的父类 Model 包含了所有必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的语法。
class Article(models.Model):
uid = models.IntegerField(primary_key=True)
title = models.CharField(max_length=255)
author = models.CharField(max_length=255)
date = models.DateTimeField()
content = models.TextField(null=True, blank=True)
primary_key=True表示设置该字段为主键(不设置的话主键默认为id字段)
null=True表示数据库中字段可以为空
blank=True表示django的 Admin 中添加数据时可允许空值
每创建一个数据模型,都要在admin中进行注册,告诉admin站点将新创建的blog的模型加入站点内,接受站点的管理。
打开blog/admin.py文件,加入下面的内容:
from django.contrib import admin
from .models import *
admin.site.register(Article)
创建数据库表
python manage.py makemigrations ## 记录下所有的关于models.py的改动
python manage.py migrate ## 将该改动作用到数据库文件
python manage.py createsuperuser ## 创建超级用户
同步旧的数据库
要是我们本来已经有了一个数据库,可以按照如下命令来自动生成数据模型文件
python manage.py inspectdb > models001.py
模型字段
BooleanField:布尔值类型
布尔值类型,默认值是None
CharField:字符串类型
必须接收一个max_length参数,表示字符串长度不能超过该值
DateField:日期类型
日期类型
DateTimeField:日期时间类型
与DateField相比就是多了小时、分和秒的显示,其它功能、参数、用法、默认值等等都一样。
EmailField:邮箱类型
默认max_length最大长度254位。使用这个字段的好处是,可以使用DJango内置的EmailValidator进行邮箱地址合法性验证。
IntegerField:整数类型
取值范围-2147483648到2147483647
PositiveIntegerField:正整数字段
包含0,最大2147483647。
PositiveSmallIntegerField:较小的正整数字段
从0到32767。
SmallIntegerField:小整数字段
包含-32768到32767。
TextField:文本字段
文本字段
TimeField:时间字段
接收同DateField一样的参数,只作用于小时、分和秒。
URLField:一个用于保存URL地址的字符串类型
默认最大长度200。
数据操作
save()
save() 根据关键字参数来转换成 INSERT SQL语句
添加数据需要先创建对象,然后再执行 save 函数
test1 = Test(name='Apress')
test1.save()
filter()
filter() 根据关键字参数来转换成 WHERE SQL语句
Publisher.objects.filter(name='Apress')
filter() 函数返回一个记录集,这个记录集是一个列表
get()
上面的例子中filter() 函数返回一个记录集,这个记录集是一个列表。get() 方法获取的是单个的对象
Publisher.objects.get(name="Apress")
这样,就返回了单个对象,而不是列表(更准确的说,QuerySet)。
如果结果是多个对象,会导致抛出异常,如果查询没有返回结果也会抛出异常
get_object_or_404()
get_object_or_404() 方法将一个Django模型作为第一个位置参数,后面可以跟上任意个数的关键字参数,如果对象不存在则弹出Http404错误。
同样,还有一个get_list_or_404()方法,和上面的get_object_or_404()类似,只不过是用来替代filter()函数,当查询列表为空时弹出404错误。(filter是模型API中用来过滤查询结果的函数,它的结果是一个列表集。而get则是查询一个结果的方法,和filter是一个和多个的区别!)
all()
all() 根据关键字参数来转换成 SELECT SQL语句。
Publisher.objects.all()
update()
update() 根据关键字参数来转换成 UPDATE SQL语句。
update() 方法会返回一个整型数值,表示受影响的记录条数
Publisher.objects.filter(id=52).update(name='Apress Publishing')
这相当于:
UPDATE books_publisher SET name = 'Apress Publishing' WHERE id = 52;
delete()方法
delete() 根据关键字参数来转换成 DELETE SQL语句。
Django要求在删除表内所有数据时显示使用all()。
Publisher.objects.all().delete()
如果只需要删除部分的数据,就不需要调用all()方法
Publisher.objects.filter(country='USA').delete()
contains
contains 会转换成 LIKE SQL语句
Publisher.objects.filter(name__contains="press")
这相当于:
SELECT * FROM books_publisher WHERE name LIKE '%press%';
order_by()
order_by() 根据关键字参数来转换成 ORDER BY SQL语句。
Publisher.objects.order_by("name")
我们还可以指定逆向排序,在前面加一个减号 - 前缀:
Publisher.objects.order_by("-name")
组合查询
Publisher.objects.filter(country="U.S.A.").order_by("-name")
转换成SQL查询就是 WHERE 和 ORDER BY 的组合:
SELECT * FROM books_publisher WHERE country = 'U.S.A' ORDER BY name DESC;
限制返回的数据
转换成 LIMIT SQL语句。
Publisher.objects.order_by('name')[0]
这相当于:
SELECT * FROM books_publisher ORDER BY name LIMIT 1;
类似的,可以用Python的range-slicing语法来取出数据的特定子集:
Publisher.objects.order_by('name')[0:2]
这个例子返回两个对象,等同于以下的SQL语句:
SELECT * FROM books_publisher ORDER BY name OFFSET 0 LIMIT 2;
注意:不支持Python的负索引(negative slicing)
虽然不支持负索引,但是我们可以使用其他的方法。 比如,稍微修改 order_by() 语句来实现:
Publisher.objects.order_by(’-name’)[0]
其他
触发出错页
assert False
视图函数参数值
视图函数里的参数值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。
句点查找
句点查找可以多级深度嵌套。 例如在这个例子中 {{person.name.upper}} 会转换成字典类型查找 person[‘name’] 然后是方法调用 upper()
Python和Django中为False的情况
- 空列表([] )
- 空元组(() )
- 空字典({} )
- 空字符串(’’ )
- 零值(0 )
- 特殊对象None
- 对象False
Python 内部变量 file
该变量被自动设置为代码所在的 Python 模块文件名。os.path.dirname(file) 将会获取自身文件所在的目录
Python 内建函数 locals()
它返回的字典对所有局部变量的名称与值进行映射
HttpRequest对象
HttpRequest对象包含当前请求URL的一些信息:
- request.path 除域名以外的请求路径,以正斜杠开头 “/hello/”
- request.get_host() 主机名(比如,通常所说的域名) “127.0.0.1:8000” or"www.example.com"
- request.get_full_path() 请求路径,可能包含查询字符串 “/hello/?print=true”
- request.META
request.META
request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 当你试图访问一个不存在的键时,会触发一个KeyError异常。
Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。 这个字典中几个常见的键值有:
- HTTP_REFERER,进站前链接网页
- HTTP_USER_AGENT,用户浏览器的user-agent字符串
- REMOTE_ADDR 客户端IP