目录对于 Django 初学者而言,最容易混淆的事情就是如何在复杂的项目目录中一步一步实现自己的代码(比如什么时候该添加 url,什么时候该注册 APP),本文以一个 hello world 为例来帮你梳理实现一个 Django 项目的步骤。
- 0. 项目实现思维导图
- 1. Django 安装,创建 Django 项目和 APP
- 2. 数据库配置
- 2.1 安装第三方数据库模块
- 2.2 新建数据库
- 2.3 数据库配置
- 3. models 文件编写
- 4. 编写 urls
- 5 编写 views 文件和 html 页面
- 6. 总结
Django 安装只需要用 pip install 或者 conda install 即可:
# pip pip install django # conda conda install django
个人推荐使用 Anaconda 创建一个虚拟环境来安装,具体的原因和 Anaconda 的安装步骤可以参考我的博客《手把手教你Anaconda安装与配置以及pycharm选择Anaconda环境》
至于 Django 项目和 APP 的创建,可以参考我的博客 《Django 学习笔记(3)——用命令行创建 Django 项目和 APP》
2. 数据库配置当你已经完成上面三步后,创建了一个名为 hello_world 的 Django 项目,并注册了一个名为 hello 的 APP 后,就可以开始我们今天的话题了。
当你的项目需要数据库时(以 mysql 为例,因为我也只会 mysql),需要进行以下两步。
2.1 安装第三方数据库模块虽然 Django 能够更简单操作数据库,但是需要第三方模块支持。与之前安装相同,可以使用 pip 安装或者 conda 安装。
# pip pip install mysqlclient # conda conda install mysqlclient2.2 新建数据库
Django 无法自动生成数据库,所以需要我们自行创建一个数据库。比如直接使用 Navicat 直接新建个数据库。
2.3 数据库配置新建好该项目对应的数据库后,找到 settings.py 文件,比如我的这个文件的目录在 ‘hello_world > hello_world’ 中,接着找到如下字段:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
将其替换为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'NAME': 'hello_world', # 数据库名字
'USER': 'xxx',
'PASSWORD': 'xxx',
'HOST': '127.0.0.1', # 服务器主机, 本地就在 127.0.0.1 或者 localhost
'PORT': 3306,
}
}
以上 'xxx' 代表是你的字段,USER 是你数据库的登录名,PASSWORD 是你数据库的密码。NAME 则是你的数据库的名称,我们的数据库名称就叫 hello_world。
3. models 文件编写如果你需要使用数据库,那么就需要编写数据库中的字段。当你配置完 settings.py 中的 DATABASES 字段后,找到 APP 中的 models.py 文件,在我们的项目中为 ‘hello_world > hello’。该文件中每个类即为数据库中的一张表。如下所示:
from django.db import models class User(models.Model): """ 用户表 """ username = models.CharField(verbose_name='用户名', max_length=32) password = models.CharField(verbose_name='密码', max_length=64)
接着我们在终端以此输入以下两行代码:
python manage.py makemigrations python manage.py migrate
即可在我们的数据库中生成一张名为 hello_user 的表 (命名规则为 APP 名字_类名 (小写))。表中的字段就是类中的字段,只不过会自动生成一个自增的主键 id。
4. 编写 urls这是我最开始学 django 时最容易忘记的一步
当我们每次编写一个新的后端逻辑的时候,需要在 urls.py 文件里写清楚路径。文件在 ‘hello_world > hello_world’ 中。
文件中有一个默认的列表:
urlpatterns = [
path('admin/', admin.site.urls),
]
当服务启动后,可以直接输入 localhost:8080/admin/ 查看该页面 (我设置的端口号为 8080)。而当我们想要创建自己的后端逻辑时,需要首先在该文件中引入 views.py 文件。
from hello import views
当然,考虑到如果后端逻辑够多(比如用户管理,财务管理等),views.py 文件会写很长,为了后期代码维护简单,可以将 views.py 文件直接给删除,然后在 hello 文件夹下再创建一个文件夹 views,在该文件夹中按照不同的功能创建不同的文件(比如用户管理为 user.py,财务管理为 financial.py),然后再 urls.py 文件中这样导包:
from hello.views import user, financial
但是由于我们的项目很简单,所以这里就在 views.py 文件中书写即可。假设我们想要个方法叫 print_hello_world,那么将 urlpatterns 改为:
urlpatterns = [
path('admin/', admin.site.urls),
path('hello_world/', views.print_hello_wolrd),
]
加上这句话后,那么每当我们访问 localhost:8080/hello_world/ 页面时,就会自动执行 views.py 文件中的 print_hello_world 方法。
注:
- 由于 urlpatterns 是个列表,所以一定要记得加逗号!
- 这里路径不需要加 /,即 /hello_world/,如果你变成 /hello_world/ 的话,访问 localhost:8080/hello_world/ 页面会 404,要想访问你的页面,必须访问 localhost:8080//hello_world/ (多了个斜杠)。
由于 views 和 html 要组合一起使用,所以就放在一起说明。首先需要注意的是,任何 views.py 里面的方法,最后必须有返回值,不然会报 500 错。这个返回值必须为以下三个之一:render,redirect,或者 HttpResponse。
from django.shortcuts import render, redirect, HttpResponse
这三个方法我也没有太仔细看,不过简单来说 render 就是渲染页面,可以传递参数给页面。redirect 是重定向,跳转到其他 urls 中的路径,也可以传参,不过参数得拼接到 url 中。HttpResponse 则是直接页面输出个文本,我个人是常用来做测试的。
注: render 中的参数是页面(比如 hello.html),而 redirect 中的参数是 urls 中的路径(比如 hello_world/)
以一个简单的例子为例,我们只需跳转到名叫 hello.html 的页面,该页面上只有 hello world,先不考虑传参,views.py 中如下:
def print_hello_world(request):
return render(request, 'hello.html')
hello.html 中就一行:
hello world
再考虑传参的版本,在 render 中传参需要传递一个字典,views.py 如下:
def print_hello_world(request):
context = {
'msg': 'hello world'
}
return render(request, 'hello.html', context)
而 hello.html 中要变为:
{{ msg }}
即一个双花括号 {{}} 中间跟传递的字典中键名(凭借我4年前学的 vue 的记忆,好像和 vue 一样?)。
当然 django 也支持在 html 中使用 for 语句与 if 语句。views.py 中:
def print_hello_world(request):
context = {
'msg': ['hello', 'world'],
'is_show': True,
}
return render(request, 'hello.html', context)
hello.html 中:
{% if is_show == True %}
{% for item in msg %}
{{ item }}
{% endfor %}
{% endif %}
注:
- for 语句和 if 语句要用 {%%} 该符号,并且记得最后要跟 {% endfor %} 和{% endif %},同时 if 语句也支持 elif 和 else。
- 如果要用索引等中括号 [] 的方式取值,那么用 .0,.1 的方式,如下:
{{ msg.0 }}
{{ msg.1 }}
6. 总结
以上就是从0开始实现一个简单的 Django 项目。当然本文涉及的东西都很简单,就是个流程化的逻辑思考过程,本文中也有许多技巧和技术没有提到,比如 form 表单,但是这些相信百度都能解决99%的问题。



