对于 Django 初学者而言,最容易混淆的事情就是如何在复杂的项目目录中一步一步实现自己的代码(比如什么时候该添加 url,什么时候该注册 APP),本文以一个 hello world 为例来帮你梳理实现一个 Django 项目的步骤。
Django
安装只需要用 pip install
或者 conda install
即可:
# pip
pip install django
# conda
conda install django
个人推荐使用 Anaconda
创建一个虚拟环境来安装,具体的原因和 Anaconda
的安装步骤可以参考我的博客《手把手教你Anaconda安装与配置以及pycharm选择Anaconda环境》
至于 Django 项目和 APP 的创建,可以参考我的博客 《Django 学习笔记(3)——用命令行创建 Django 项目和 APP》
当你已经完成上面三步后,创建了一个名为 hello_world
的 Django 项目,并注册了一个名为 hello
的 APP 后,就可以开始我们今天的话题了。
当你的项目需要数据库时(以 mysql
为例,因为我也只会 mysql
),需要进行以下两步。
虽然 Django
能够更简单操作数据库,但是需要第三方模块支持。与之前安装相同,可以使用 pip
安装或者 conda
安装。
# pip
pip install mysqlclient
# conda
conda install mysqlclient
Django
无法自动生成数据库,所以需要我们自行创建一个数据库。比如直接使用 Navicat
直接新建个数据库。
新建好该项目对应的数据库后,找到 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
。
如果你需要使用数据库,那么就需要编写数据库中的字段。当你配置完 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
。
这是我最开始学 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
中就一行:
<span>hello worldspan>
再考虑传参的版本,在 render
中传参需要传递一个字典,views.py
如下:
def print_hello_world(request):
context = {
'msg': 'hello world'
}
return render(request, 'hello.html', context)
而 hello.html
中要变为:
<span>{{ msg }}span>
即一个双花括号 {{}}
中间跟传递的字典中键名(凭借我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 %}
<span>{{ item }} span>
{% endfor %}
{% endif %}
注:
for
语句和 if
语句要用 {%%}
该符号,并且记得最后要跟 {% endfor %}
和{% endif %}
,同时 if
语句也支持 elif
和 else
。[]
的方式取值,那么用 .0
,.1
的方式,如下: <span>{{ msg.0 }} span>
<span>{{ msg.1 }}span>
以上就是从0开始实现一个简单的 Django 项目。当然本文涉及的东西都很简单,就是个流程化的逻辑思考过程,本文中也有许多技巧和技术没有提到,比如 form
表单,但是这些相信百度都能解决99%的问题。