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)
 

© 2PoL 2020 - 2025