什么是Django

  • 一个web框架
    • 可用其快速开发网站
    • 基于python
  • “for perfectionsists”
    • 安全性高
    • 可拓展性强
  • with ddl
    • 开发速度较快
    • 代码量较小,轻量化

Django环境搭建

  1. python环境(官网下载即可)
  2. Django环境(pip install django==版本)

Django基本操作

创建项目

django-admin startproject <项目名>

生成一个项目文件夹,其下包含一个项目文件夹和一个配置文件manage.py

项目文件夹下包含四个文件:

  1. init:python中的固定文件,说明这是一个包,可以被其他程序调用
  2. setting:Django项目的管理文件
  3. urls:整个网站的路由控制,整个网站的url,规定哪些url可以访问
  4. wsgi:部署时需要用到的文件

响应请求

如何打开网址?

这个过程本质上是由客户端向urls发送打开网址的请求,如果网址有效,urls分析网址并整合相关资源,处理请求,响应请求,返回相关内容。这是通过http协议实现的。

打开网址的方法:

写响应内容

首先在urls.py中import了path方法,path方法返回一个对象(list)放入urlpatterns中

path('网址',调用方法)

新建views.py,首先

from django.http import HttpResponse

然后定义一个方法

def index(request):
    return HttpResponse("Hello World")

这其中HttpResponse是一个函数,可以返回内容给网址,即返回给request

添加到urls中

首先在urls.py中先 引入views.py

from . import views
#.表示同级目录

然后添加新的网址和写好的响应内容

path('',views.index)
#什么都不写,就是主页(直接访问)

启动网站

进入到项目文件夹下,使用命令行输入

python manage.py runserver

如果端口未被占用,则自动将项目部署到本地端口http://127.0.0.1:8000/,此时就可以访问网址了。正常情况下请求码应为200,若网址错误则返回404,若出现用户错误等其它错误,则返回500。

总而言之,只有200的时候才可以正常打开网址。

Django3的版本好像没有了re_path方法了,现在只能用path。

创建超级用户(管理员)

进入http://127.0.0.1:8000/admin,可以看到用户登录界面,此时我们可以在本机创建超级用户。

你需要先用ctrl+c退出当前环境使命令行可操作,你可以用

python manage.py help

来查看自己可以使用的方法

首先必须为项目创建一个数据库才能让项目有所谓“后台”,自然才能有管理员

python manage.py migrate

自动在本地生成一个sqlit3的数据库

然后在用

pyhon manage.py creatsuperuser

创建超级用户,输入username和password之后就可以使用,可以不用输入email,即使你的password被提示太简单,你也可以继续使用例如root这样的弱智密码。

更改网站默认语言

Django默认的语言是英语(废话),但是你也可以修改为中文,看着舒服点。

你可以在setting.py下找到LANGUAGE_CODE 这一项,并将其改为

LANGUAGE_CODE = 'zh-Hans'

Hans表示简体中文,Hant表示繁体中文。

app相关

为何要创建基本app

在网站中,存在很多需要批量重复的内容块:比如在个人博客中,这个内容块可能是文章;在电商网站中,这个内容块可能是具体的商品。在需要批量重复内容块时,有一定的模型可以让我们的开发更加快速。在Django中,这样的内容模型被称为app。

如何创建app

python manage.py startapp <应用名称>

startapp顾名思义就是创建一个app,执行后会在项目文件夹下生成一个名为应用名称的文件夹,下面包含一系列的东西:

  1. init:与上文一致
  2. models:即模型,在其中定义具体的模型内容,用class类来定义

下面来具体讲一下如何定义模型

定义模型

进入models.py,定义新的类,注意要继承模型类

class <aritcla>  (models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()

学过数据库的同学应该都知道类似的操作,class就像定义一个关系,其中有很多个属性,每个属性有一个域,这里域就用字段类型来定义,其实整体结构和sql语句类似。sql语句中创建表的操作案例如下:

CREATE TABLE 花卉
           (花卉编号 char(8) PRIMARY KEY,
            花卉名称 char(20),
            单价 Numeric(8,2),
            库存量 int,
            );

可以看出二者的操作极其相似,你也可以把模型理解成一个二维表。比如article这个模型拥有content和title两个属性,goods这个模型拥有name和price两个属性这样。当然,一个模型不一定只来源于一张表,也可以来自多张表。

使用模型

在写好模型之后,我们并不能直接的使用模型,我们必须注册该应用,表示我们会使用该应用,然后将其同步到我们的数据库中。还记得我们创建数据库的指令码?migrate,即迁移,我们必须把我们创建的模型同步到数据库中,这样我们才能在网站上使用它。这时候我们首先在全局设置文件setting中找到installed_app,在列表中将我们的app写入,然后执行以下命令

python manage.py makemigrations #制造迁移
python manage.py migrate #正式迁移

若在你的models.py中没有语法错误等,你就可以正确的create并且apply你的应用,但这时候我们还是不能在网站的admin中找到我们的应用。因为我们只是CREATAPPLY了这个app,还没有REGISTER这个app。我们需要打开应用文件夹下的admin.py来注册我们的应用。

首先我们需要引入我们的模型到admin.py中,然后注册我们的模型。

from .models import Article
admin.site.register(Article)

此时,我们就可以在网站的控制后台找到我们的模型了,并且自由的使用了。使用当然也很方便,直接添加就可以了,当然由于我们前面所指定的属性都没有允许空值的存在,所以这里你必须title和content都要有内容。

显示内容

如果我们想要在网站中显示我们的模板内容,我们首先要给出一个url来存放我们的内容。而正如我们在为何要创建app中所说,我们创建app就是为了减少重复操作,如果全部手动创建url对我们来说肯定是无法接受的,所以我们就需要一个自动获取对象的方法。

有相关知识的人应该都想到了,除了title和content以外,我们的article这个app还应该拥有一个类似于id的东西方便我们检索。是的,在迁移到数据库中时,系统已经自动为我们创建了自动增长的主键id,你可以在migration文件夹下找到py文件自己查看。(毕竟sqlite3是一个关系数据库,title和content不一定能成为主键,它就自己创建了一个主键)

有了这个id,我们就可以方便的展示和查询我们的article了。

而之后的操作就类似与 响应请求 中的操作,先定义一个方法,再在某个具体的url中调用方法展示内容。


比如这里我们在app文件夹下的views.py中定义如下方法:

def article_detail(request,article_id):
    return HttpResponse('文章id为: %s' % article_id)

这样我们就可以返回文章的id

然后再回到全局的urls.py中

path('article/<int:article_id>',aritcle_detail,name='1'),

就可以在http://127.0.0.1:8000/article/122这样的url看到内容了。

当然,聪明的人应该已经发现问题了——这个东西并没有真正的调用app…因为我们根本没有122之多的文章,这是一个假的东西,只不过是获得了你输入的id并且在页面中显示…


要想要获得app中的内容,我们当然要首先引入模型

在app文件夹下的views.py中

from .models import Article

然后通过app.objects.get这一方法通过某些条件获得模型,将模型存入一个对象中,并且检索其中的属性值返回

def article_detail(request,article_id):
    article = Article.objects.get(id = article_id)
    return HttpResponse('文章标题为: %s 文章内容为: %s' % (article.title, article.content))

此时如果你要访问article/122,就无法访问,显示DoesNotExist这样的错误,那么为了让用户知道发生了什么,我们需要来处理这个异常。我们可以用404方法来抛出这个异常。

from django.http import Http404
def article_detail(request,article_id):
    try:
        article = Article.objects.get(id = article_id)
    except Article.DoesNotExist:
        raise Http404('该文章不存在')
    return HttpResponse('文章标题为: %s 文章内容为: %s' % (article.title, article.content))

当然还有更加简洁的方法跳转到404页面,但是这个时候你就无法定制你404页面的显示内容,不过话又说回来,谁会想要去定制呢?

from django.shortcuts import get_object_or_404
def article_detail(request,article_id):
    article = Article.get_object_or_404(id = article_id)
    return HttpResponse('文章标题为: %s 文章内容为: %s' % (article.title, article.content))

使用html模板显示app内容

你当然可以将html内容全部写在HttpResponse()中,但是这样你会非常的麻烦,而且当你要修改网页内容样式的时候,你还要回到这里修改,十分复杂,前后端代码混合;而且如果你要在多个方法里面使用一个模板也很不方便。于是乎我们建议将模板文件和方法分离。

你首先需要在app文件夹下创建一个新的文件夹templates,这个名字是在settings里面规定好的,所以你只能用这个名字。当然,如果你仔细观察settings里面的内容你会发现,其中有一个DIRS可以让你填充你写目录,当然这个我们以后再讲。’APP_DIRS’: True表示APP文件夹下的模板文件是有效的,True是默认值。你需要将html模板存入templates文件夹中使其能被获取。


具体的html模板创建这里就不再多说,有兴趣的可以看我的上一篇文章,(当然更建议系统的学习)。这里主要来讲一下怎么让模板文件读取到你在方法中设置的两个“坑”,也就是两个位置(在上文中为title和content)。

还记得views.py中事先引入的render方法吗?这个方法可以返回一个http响应,我们需要一个字典来存入我们获得的对象的值,我们可以直接用键去指定值,将article这个对象的值存入context之中

from django.http import Http404
def article_detail(request,article_id):
    try:
        article = Article.objects.get(id = article_id)
        context = {}
        context['article_obj'] = article
        return render(request,'html模板地址',context)
    except Article.DoesNotExist:
        raise Http404('该文章不存在')
    return HttpResponse('文章标题为: %s 文章内容为: %s' % (article.title, article.content))

那么html模板怎么知道我们的两个值要放在哪里呢?我们要用`{{}}`这样的格式告诉html从哪里读取内容,就比如这样:

<h2>{{ article_obj.title}}</h2>
<p>{{ article_obj.content}}</p>

这样我们就可以使用html模板显示app中的内容了。


web      -前端

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

Django学习笔记(2) 上一篇
如何做一个还能看的个人博客(1) 下一篇