django笔记

创建项目

创建项目

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

这样就可以直接生成一份models.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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值