django 快速入门

Django是Python语言编写的一个全栈式Web框架,可以拉我们快编写一个享数据库功能、增删查改、后台管理等功效的网站。假如你只有待有些不行粗略的效果,使用flask可能是单又好之挑选。但是倘若您想迅速实现一个XX管理体系,那么用Django绝对是个好措施。本文参考了Django官方文档的Tutorials。另外我这里用的巅峰是Powershell,如果略微命令不可知运行,去丢前面的.\

很快开

安装Django

第一安装Django包,现在Django已经到了2.0版,如果还在采用1.11请求及早升级。旧本子后才修复bug,不见面加加新成效。

pip install django

创办项目

Django安装好以后,会顺手一个命令行工具django-admin,可以帮我们管理Django项目。我们得以用下的下令创建一个新的Django项目模板。这样会创django_sample文本夹,项目文件就在其中。另外需要注意项目文件夹最好是个性化一点底,不要与django、sys这样的老三方库或者python系统库重名。

django-admin startproject hello_django

开创好路下,我们进项目文件夹着。用底的通令就好运作Django项目了。默认情况下,我们可通过http://127.0.0.1:8000/来做客在运作的花色。由于无任何页面,所以会见展示这样一个调节窗口。

python manage.py runserver

运行成功

创建app

于Django项目面临,app表示又粗之一个功力单位,比方说当一个博客管理体系受到,对博客的增删查改等作用就应该聚合在一个app中。进入项目目录中,用startapp令创建app。

cd .\hello_django\
django-admin startapp hello

这儿项目目录结构应该接近这样。

目结构

为吃django包含创建的app,我们尚亟需激活app。打开配置文件,找到INSTALLED_APPS,然后拿咱创建的app配置丰富进去,这样django才能采取我们的app。

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

模型层

安装数据库

打开配置文件settings.py,找到数据库一行,可以看如下的布置。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

倘我们这儿使用python .\manage.py migrate命生成数据库表,就会见于项目被冒出一个db.sqlite3文本,这就是默认的数据库文件,使用IDEA右键点击并摘As DataSource就好拿该视作数据库打开。然后我们会看出变化了10大抵单数据库表,这是Django程序存储数据变化的阐明。

django系统表

除此之外sqlite数据库,django还支持POstgreSQL、MySQL、Oracle这几乎独数据库。如果上加第三方后端支持,还好运用SQL
Server、IBM
DB2等数据库。例如我本备选采取PostgreSQL数据库,就修改为下的布置。这时候NAME属性的含义就是数据库的讳。另外要保证数据库事先在,django可以自动创建表,但是不能自动创建数据库。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'test',
        'USER': 'postgres',
        'PASSWORD': '12345678',
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

始建模型

django支持ORM模型,也就是说我们得无下SQL语句就对数码开展增删查改。我们设做的即使是在模型中指定同数据库的涉嫌。

打开hello
app中的models.py文件,然后上加下面两个模型。这简单单模型是宠物和所有者的关联。如果应用了任何ORM框架比如Hibernate之类的语句,对这种结构应当十分熟悉。我们在概念模型的早晚指定每一个字段的讳、长度、是否唯一等消息。值得注意的是,如果需要之价只有恐是几乎单固定值,可以定义一个元组(该元组有一对值构成,第一独价值是实际上有数据库被之值,第二个是为人类展示的和睦而读值),然后传入choices参数。models.ForeignKey之所以来指定外键约束,还有一部分别样的对应关系像多针对几近、一对一相当于便非介绍了。

from django.db import models

class Owner(models.Model):
    GENDER = (
        ('M', 'MALE'),
        ('F', 'FEMALE')
    )
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=30, unique=True)
    gender = models.CharField(max_length=1, choices=GENDER)
    birthday = models.DateField()


class Pet(models.Model):
    TYPE = (
        ('C', 'Cat'),
        ('D', 'Dog')
    )
    id = models.AutoField(primary_key=True)
    owner = models.ForeignKey(Owner, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    type = models.CharField(max_length=1, choices=TYPE)

变动并采用迁移文件

面我们创建了一定量只模型,实际上,只要我们对范进行了变更,就应用下的授命生成这些改变。

python manage.py makemigrations hello
Migrations for 'hello':
  hello\migrations\0001_initial.py
    - Create model Owner
    - Create model Pet

并且在migration文本夹中生成了相应的搬迁文件。

只要想明白搬文件会实际生成什么的SQL语句,可以调用下面的命。这里的序号是迁移序号,每次对范进行反都见面变一个新的迁移文件,想查哪个文件生成的SQL语句,就指定哪个序号。

python manage.py sqlmigrate hello 0001

结果该接近下面这样。

BEGIN;
--
-- Create model Owner
--
CREATE TABLE "hello_owner" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(30) NOT NULL UNIQUE, "gender" varchar(1) NOT NULL, "birthday" date NOT NULL);
--
-- Create model Pet
--
CREATE TABLE "hello_pet" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(50) NOT NULL, "type" varchar(1) NOT NULL, "owner_id" integer NOT NULL REFERENCES "hello_owner" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "hello_pet_owner_id_a7d7b3df" ON "hello_pet" ("owner_id");
COMMIT;

本就只是颇成了搬迁文件,并没有真的使用及数据库被。如果要引用到数据库,再次用migrate命令即可。这时候又查看数据库,就会见意识差不多矣hello_owner和hello_pet两单说明,正好对应我们的有数只模型。

python manage.py migrate

多少操作

用底的一声令下打开django Shell。

python manage.py shell

一旦不思量利用命令,也可装DJANGO_SETTINGS_MODULE环境变量的种之settings.py文件,然后于python解释器中安django
shell。

>>> import django
>>> django.setup()

不论是故啊种办法,都好打开shell,在即时个中就得采取API操作数据了。首先引入我们的模型。

In [1]: from hello.models import Owner, Pet

追加有数码。

In [4]: o1=Owner(name='zhang3',birthday='1992-5-7',gender='M')
In [5]: o1.save()
In [6]: o2=Owner(name='limei',birthday='1996-6-8',gender='F')
In [7]: o2.save()
In [8]: p1=Pet(owner=o1,name='lele',type='D')
In [9]: p1.save()

脚是有询问例子,get函数查询单个模型,filter函数查询多单模型,all函数查询所有模型。

In [7]: Pet.objects.all()
In [8]: Pet.objects.get(id=1)
In [11]: Owner.objects.get(name='zhang3')
In [14]: Owner.objects.filter(gender='M')
In [18]: Owner.objects.count()

点的只能执行规范查找某个字段,如果要还复杂的好使对生划綫加查询谓词的款式。详细文档参考https://docs.djangoproject.com/en/2.0/topics/db/queries/\#field-lookups-intro。

In [20]: Owner.objects.filter(name__startswith='z')
In [22]: Owner.objects.filter(birthday__year__lte='1994')
In [30]: Owner.objects.filter(name__contains='5')

删去某个对象。

In [31]: p2.delete()

以调试再利于,我们尚得当当下有限独模型上加加str函数。这样调试之当儿即便逾爱读了。

class Owner(models.Model):

    def __str__(self):
        return f'Owner(id:{self.id}, name:{self.name}, gender:{self.gender}, birthday:{self.birthday}'


class Pet(models.Model):

    def __str__(self):
        return f'Pet(id:{self.id}, name:{self.name}, type:{self.type}'

Django Admin

Django Admin可以辅助我们飞速管理后台数据。首先要创造一个总指挥账户。

python manage.py createsuperuser

创造好后,通过http://127.0.0.1:8000/admin/访管理员界面并输入才设置的管理人及密码,会见到如下的界面。

领队界面

这边时呀还没,我们得将模型注册及Admin中。打开admin.py文件,输入下面的情节。

from django.contrib import admin

# Register your models here.
from .models import Owner, Pet

admin.site.register(Owner)
admin.site.register(Pet)

这样一来,就好以组织者界面中管理型了。

管理模型

页面及视图

路由

首先在app的views.py中添加一个初的视图。不过依照Spring
MVC的道岔,我道这里的这些视图叫控制器似乎还合理一些,不过既然这个文件还叫作view,那么我呢让其视图吧。

from django.http import HttpResponse

def index(request):
    return HttpResponse('hello')

接下来于app中开创一个urls.py文本,写副以下内容。

from django.urls import path
from . import views

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

下一场于路的urls.py文本中添加app中安装的途径,除了admin页面的路径之外,其他路线都该运用include函数引入。

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

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

然后访问http://127.0.0.1:8000/hello/,应该就可以看到亮的字符串了。

路参数

假如路由是牵动路径参数的,那么用<类型:变量名>语法。

urlpatterns = [
    path('', views.index, name='index'),
    path('hello/<str:name>', views.hello, name='hello')
]

对应之参数作为视图函数的第二单参数。

def hello(request, name):
    return HttpResponse(f'hello, {name}')

这样,访问http://127.0.0.1:8000/hello/hello/yitian就可以看到对应之出口了。

运用模板

在app中创建templates/hello文本夹,然后以其间创建index.html文件,文件内容如下。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
<h1>Hello,{{ name }}</h1>
</body>
</html>

然后修改view.py文件,将hello视图修改也底的师。再次走访就可以看到这次成功的回到了网页。

from django.http import HttpResponse
from django.template import loader

def hello(request, name):
    template = loader.get_template('hello/index.html')
    context = {'name': name}
    return HttpResponse(template.render(context, request))

django还提供了快捷render函数可以简化这返回模板的大面积过程。

from django.http import HttpResponse
from django.shortcuts import render

def hello(request, name):
    context = {'name': name}
    return render(request, 'hello/index.html', context)

聊同学也许产生问号,为什么模板文件夹着还要以创建一个hello子文件夹呢?这是由django的文书搜索机制所导致的。当找模板文件的下django会从所有app的templates文件夹着查找,但是连无见面区分它们,所以只要以差不多个app中出相同的文件称,django会使用找到的率先只。因此为区别它们我们不得不协调多创造同重叠文件夹用于分别。

和flask一样,django默认使用Jinja2模板,关于jinja2的语法请查阅相关文档,这里就未以事无巨细说明了。

页面被使用URL

当我们当页面被要采取路径的早晚,不要硬编码路径,最好使用url标签。例如下面这样的。

<a href="{% url 'hello' '张三' %}">你好,张三</a>

此地url标签中指定的称是urls.py文件被路径的name参数。

path('hello/<str:name>', views.hello, name='hello')

当型被有多单app的早晚,需要利用命名空间来分别。做法非常粗略,在urls.py文件中添加app_name属性。

app_name = 'hello'
urlpatterns = [
    path('', views.index, name='index'),
    path('hello/<str:name>', views.hello, name='hello')
]

下一场在标签及上加用冒号分隔开的命名空间名称即可。

<a href="{% url 'hello:hello' '张三' %}">你好,张三</a>

赢得表单参数

每当页面被补充加如下一个表单。{% csrf_token %}标签是django内建的效力,可以辅助我们防止csrf攻击。

<form action="{% url 'hello:form' %}" method="post">
    {% csrf_token %}
    <label for="name">name</label>
    <input type="text" name="name" id="name">
    <br/>
    <label for="male">male</label>
    <input type="radio" name="gender" value="male" id="male">
    <label for="female">female</label>
    <input type="radio" name="gender" value="female" id="female">
    <br>
    <label for="age">age</label>
    <input type="text" name="age" id="age">
    <br>
    <input type="submit" value="submit">
</form>

接下来上加下面一久路子。

path('form', views.get_form, name='form')

说到底补充加处理函数,这个处理函数很粗略,仅仅返回结果文本。需要取得参数的下,直接用request.POST即可,它是一个近乎字典的靶子,我们可以通过键来访问对应参数的价值。

def get_form(request):
    form = request.POST
    return HttpResponse(f"name:{form['name']}, gender:{form['gender']}, age:{form['age']}")

静态文件

app内静态文件

对此样式表等静态文件,如果是在app内的,不需分外设置。只要以app内创建static文件夹并拿静态文件放入即可。之后以页面中引用的时候增长下面的标签即可。注意在运static标签之前,需要为此{% load static %}加载它。

    {% load static %}
    <link rel="stylesheet" href="{% static 'site.css' %}">

文件结构类似下图。

静态文件结构

得小心的是,由于前介绍的django文件搜索机制,在静态文件夹着,我们无限好当指定一级及app同名的文件夹用来区分不同app间的静态文件。

项目公用静态文件

聊静态文件或者是多单app公用的,这时候要进行一点额他设置。首先在与app同级的目创建static文件夹并将静态文件放入。然后在部署文件中上加额外之搜路径配置。

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

还是由于django文件搜索机制,我们尽好当静态目录中上加一个public子文件夹和另外静态文件分别。

测试

django支持自动化测试,可以扶持我们迅速查找bug。测试文件应当写及tests.py文件被。下面是一个略的例证。

from django.test import TestCase


class SampleTest(TestCase):
    def test_true(self):
        self.assertTrue(True, 'is true')

TestCase基类含有各种断言方法,可以协助咱开展判定,这里虽无列举了。

倘运行测试的讲话,使用下的命。可以视django还见面自动创建与去测试数据库,非常有利于。

PS D:\kang\PycharmProjects\python-study\hello_django> python .\manage.py test hello
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.015s

OK
Destroying test database for alias 'default'...

如上就是是某些对此django框架的牵线。希望大家在拘留罢以后可以对django框架有有着力了解。本来我是准备按照在官方文档的科目来写的,但是写了一半感觉到课内容极其多,没道放到一首文章被。所以就算描写成了如此一个断断续续的稿子。之后发时间我会慢慢写篇,仔细介绍django的各个方面的情。

网站地图xml地图