Django quick start
date
Apr 20, 2022
slug
af0c495fbe0fd5a6f181bfc33a2bc725
status
Published
tags
Django
summary
Django 是基于 Python 的 Web 框架,有开发周期短的优点。
type
Post
App 机制
在 Django 中的一个 app 代表一个功能模块。开发者可以将不同功能的模块放在不同的 app 中, 方便代码的
复用。app 就是项目的基石。
Project_name
│ db.sqlite3
│ manage.py
│
├─app
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ └─migrations
│ └─ __init__.py
│
└─Project_name
│ settings.py
│ urls.py
│ wsgi.py
└─ __init__.py
创建 app 需要
python manage.py startapp appname
接着在 Project_name/settings.py
注册这个 app ,在 Project_name/url.py
中配置访问路径:
`path('article/', include('article.urls', namespace='article')),- 参数
article/
分配了 app 的访问路径;
include
将路径分发给下一步处理;
namespace
可以保证反查到唯一的 url,即使不同的 app 使用了相同的 url app 内页面的路由转发同理,新建app/urls.py
:
# article/urls.py
# 引入path
from django.urls import path
# 正在部署的应用的名称
app_name = 'article'
urlpatterns = [
# path()...
]
MTV 框架
Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。
- 模型(Model):即数据存取层,处理与数据相关的所有事务:如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
- 模板(Template):即业务逻辑层,处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
- 视图(View):即表现层,存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。
在 Django 开发时,同一般的软件设计流程相似,先设计数据库字段,即设计 Model;接着设计界面,即 Template,最后实现数据库与界面之间的逻辑,即 View。
如何连接三者呢?通过 url。
在
app/views.py
中导入 app/model.py
中定义的数据类。
在 app/urls.py
中导入 app/views.py
中定义的逻辑函数。
在 template/app/
中对应的页面中使用 django 的模版方法引入 views.py
的 逻辑或数据。
其中:- 数据通过传入
render
函数的context
变量引用。
- 函数通过 url 传入
<a href="{% url "article:article_update" article.id %}">编辑文章</a>
Model
对数据更改后要执行以下两条指令:
python manage.py makemigrations
python manage.py migrate
Template
Templates inheritance symbol is
{%
.{% block content %}
{% endblock %}
{% extends “base.html” %} # 继承 base.html
{% include 'header.html' %} # 加入 header.html
{% url '...' %} # Django 规定的模板解耦语法
{% url 'article:article_list' %}
- 前面的 `article` 是在项目根目录的 `urls.py` 中定义的 app 的名称
- 后面的 `article_list` 是在 app 中的 `urls.py` 中定义的具体的路由地址
path('article-list/', views.article_list, name='article_list'),
{% url 'article:article_detail' article.id %}
path('article-detail/<int:id>/', views.article_detail, name='article_detail'),
- 在
list.html
中,通过href="{% url 'article:article_detail' article.id %}"
,将 id 传递给article/urls.py
- 在
article/urls.py
中,通过<int:id>
传递给视图函数article_detail()
- 在视图函数
article_detail()
中,通过形参id
取得了文章的 id 值,并进行处理,最终定位了需要获取的文章对象
模版中的文件结构如下:
templates
│
├─base.html
├─header.html
├─footer.html
└─app
└─app's html files
模板需要的静态资源放置在
Project/static
View
Essential library:
from django.shortcuts import render, redirect
from django.http import HttpResponse
传值函数:
def function_name(request):
value = value_model.objects.all()
context = {'value' : value}
return render(request, 'template.html', context)
表单函数:
def function_name(request):
# 判断用户是否提交数据
if request.method == "POST":
# 将提交的数据赋值到表单实例中
article_post_form = ArticlePostForm(data=request.POST)
# 判断提交的数据是否满足模型的要求
if article_post_form.is_valid():
# 保存数据,但暂时不提交到数据库中
new_article = article_post_form.save(commit=False)
# 指定数据库中 id=1 的用户为作者
# 如果你进行过删除数据表的操作,可能会找不到id=1的用户
# 此时请重新创建用户,并传入此用户的id
new_article.author = User.objects.get(id=1)
# 将新文章保存到数据库中
new_article.save()
# 完成后返回到文章列表
return redirect("article:article_list")
# 如果数据不合法,返回错误信息
else:
return HttpResponse("表单内容有误,请重新填写。")
# 如果用户请求获取数据
else:
# 创建表单类实例
article_post_form = ArticlePostForm()
# 赋值上下文
context = { 'article_post_form': article_post_form }
# 返回模板
return render(request, 'article/create.html', context)