Django 2.1.1 使用笔记

配置相关

python 3.7、mySQL的适配问题

官网上这里没写的太清楚,解决办法如下:

  1. 通过pip下载pymysql
pip install pymysql
  1. 在项目根目录下 init.py 文件中添加以下代码
import pymysql
pymysql.install_as_MySQLdb()

跨站点请求伪造保护

在任何使用POST表单的模板中,如果表单用于内部URL,请使用元素csrf_token内的标记,例如:

<form method="post">{% csrf_token %}

对于以外部URL为目标的POST表单,不应该这样做,因为这会导致CSRF令牌泄露,从而导致漏洞。

PYTHON代码vim快速注释和删除

两种方法:

  1. CTRL+V进入列选择模式,选择其中的#,然后按d进行删除。
  2. 可以利用:首行,尾行s/^/#/g进行注释,利用:首行,尾行s/^#//g进行反注释。

Django的基础使用

Django的工程生成

在某个目录下,如果想要创建mysite工程,则在CMD下运行

$ django-admin startproject mysite

运行工程

检测项目是否创建成功

$ python manage.py runserver

在工程中创建一个应用

在mysite下创建一个polls应用

$ python manage.py startapp polls

如果要应用我们新建的应用,则应该在应用polls的目录polls/urls.py中,输入如下代码

from django.urls import path
from . import views

urlpatterns=[
    path('',views.index,name='index'),
]

并在工程的根目录下urls.py文件添加对这个应用的引用

from django.contrib import admin
from django.urls import include, path

urlpatterns=[
    path('polls/',include('polls.urls')),
    path('admin/',admin.site.urls),
]

include 函数,就是将完整的python路径导入到另一个urlconf模块,该模块应该“包含”在这个地方。
admin模块是管理模块,不需要include。

path的四个参数

函数 path() 具有四个参数,两个必须参数:route 和 view,两个可选参数:kwargs 和 name。

path() 参数: route
route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。

这些准则不会匹配 GET 和 POST 参数或域名。例如,URLconf 在处理请求 https://www.example.com/myapp/时,它会尝试匹配myapp/。处理请求https://www.example.com/myapp/?page=3时,也只会尝试匹配 myapp/

path() 参数: view
当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个 HttpRequest 对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。稍后,我们会给出一个例子。

path() 参数: kwargs
任意个关键字参数可以作为一个字典传递给目标视图函数。本教程中不会使用这一特性。

path() 参数: name
为你的 URL 取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个 URL 模式。

Django数据库相关

数据库配置

mysite/settings.py这是个包含了 Django 项目设置的 Python 模块。

通常,这个配置文件使用 SQLite 作为默认数据库。Python 内置 SQLite,所以你无需安装额外东西来使用它。当你开始一个真正的项目时,你可能更倾向使用一个更具扩展性的数据库,避免中途切换数据库这个令人头疼的问题。

如果你想使用其他数据库,你需要安装合适的 database bindings ,然后改变设置文件中 DATABASES ‘default’ 项目中的一些键值:

ENGINE– 可选值有 ‘django.db.backends.sqlite3’,‘django.db.backends.postgresql’,‘django.db.backends.mysql’,或 'django.db.backends.oracle’以及其它可用后端。

NAME- 数据库的名称。如果使用的是 SQLite,数据库将是你电脑上的一个文件,在这种情况下, NAME 应该是此文件的绝对路径,包括文件名。默认值 os.path.join(BASE_DIR, ‘db.sqlite3’) 将会把数据库文件储存在项目的根目录。
如果你不使用 SQLite,则必须添加一些额外设置,比如 USER 、 PASSWORD 、 HOST 等等。

在使用前,应先编辑mysite/setting.py的TIME_ZONE为自己的时区。

在Django的配置文件settings.py中,有两个配置参数是跟时间与时区有关的,分别是TIME_ZONE和USE_TZ。
如果USE_TZ设置为True时,Django会使用系统默认设置的时区,即America/Chicago,此时的TIME_ZONE不管有没有设置都不起作用。
如果USE_TZ 设置为False,而TIME_ZONE设置为None,则Django还是会使用默认的America/Chicago时间。若TIME_ZONE设置为其它时区的话,则还要分情况,如果是Windows系统,则TIME_ZONE设置是没用的,Django会使用本机的时间。如果为其他系统,则使用该时区的时间,入设置USE_TZ = False, TIME_ZONE = ‘Asia/Shanghai’, 则使用上海的UTC时间。
——此处感谢CSDN @brad1994

Django的默认安装项

INSTALLED_APPS 默认包括了以下 Django 的自带应用:

  • django.contrib.admin – 管理员站点, 你很快就会使用它。
  • django.contrib.auth – 认证授权系统。
  • django.contrib.contenttypes – 内容类型框架。
  • django.contrib.sessions – 会话框架。
  • django.contrib.messages – 消息框架。
  • django.contrib.staticfiles – 管理静态文件的框架。

这些应用被默认启用是为了给常规项目提供方便。

默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。请执行以下命令

python manage.py migrate

这个 migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表,至于具体会创建什么,这取决于你的 mysite/settings.py 设置文件和每个应用的数据库迁移文件。这个命令所执行的每个迁移操作都会在终端中显示出来。

模型

定义模型

每个模型都是一个python类,这些类继承django.db.models.Model. 模型类的每一个属性都相当于一个数据表的字段,Django自动生成访问数据库的API.
例如,定义一个person

from django.db import models

class Person(models.Model):
    firest_name= models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

上面的模型会自动建立如下的表:

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);
使用模型

定义过后,需要告诉Django需要使用这类的模型.需要修改设置文件中的INSTALLED_APPS,在这个设置中添加包含models.py文件的名字. 例如,如果模型位于项目中的"myapp.models"中,设置应该如下:

INSTALLED_APPS = [
#....
'myapp',
#.....
]

在添加后,应运行

python manage.py migrate

进行移植更新.

字段

模型中最重要的、并且也是唯一必须的是数据库的字段定义。字段在类中定义。定义字段名时应小心避免使用与 models API</ref/models/instances>冲突的名称, 如 clean, save, or delete等.

from django.db import models

class Musician(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

class Album(models.Model):
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

模型的每一个字段都是一个Field类的实例,每个字段都有特定的参数,例如CharField就需要max_length参数.
常用的Field选项还有以下几个:

  • blank: 如果是True,则字段允许为空,默认是False.
  • choice: 是一个二元列表,列表第一列存储到数据库中,第二列用于显示.例如
YEAR_IN_SCHOOL_CHOICES = (
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
    ('GR', 'Graduate'),
)

对应的Choice可以用get_F00_display()获得第二列的内容. F00就是定义的Choice的实例的名字. 该方法是继承于model类的.

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
  • primary-key: 主键,如果被定义,则系统默认的主键ID就没有了. 主键是readonly的,如果主键更改了,则系统会生成一个新的记录.
from django.db import models

class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
<QuerySet ['Apple', 'Pear']>
  • unique: 如果是True,则该属性就不能有相同的.
外键
class ForeignKey(to, on_delete, **options)[source]

on_delelte属性如下:

  • CASCADE: 模拟SQL的CASCADE,将包含外键的对象一起删除.
  • PROTECT: 阻止删除, 引发ProtectedError.
  • SET_NULL: 将外键设置成null.
  • SET_DEFAULT: 将外键设置成default值.
  • SET(): 将外键设置成Set().
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models

def get_sentinel_user():
    return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET(get_sentinel_user),
    )
  • DO_NOTHING: 什么也不做

如果引用一个还没有定义的关系,可以用模型名字来替代模型的对象.

from django.db import models

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'Manufacturer',
        on_delete=models.CASCADE,
    )
    # ...

class Manufacturer(models.Model):
    # ...
    pass

激活模型

Django可以创建数据库,创建可以与数据库交互的API,但是首先要安装, 迁移, 激活.

安装: 在INSTALLED_APPS中添加设置.因为PollsConfig类卸载文件polls/apps.py中,引入点式路径的名字是’polls.apps.PollsConfig’

INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

然后运行

$ python manage.py makemigrations polls

Django会检测你对模型的修改,并且把修改的部分存储为一次迁移.输出类似如下的信息:

Migrations for 'polls':
  polls/migrations/0001_initial.py:
    - Create model Choice
    - Create model Question
    - Add field question to choice
$ python manage.py sqlmigrate polls 0001

可以输出迁移的SQl的信息.

再次运行migrate,可以在数据库里创建新的数据表.

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Rendering model states... DONE
  Applying polls.0001_initial... OK
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值