













豆包给出的知识点:
Django 是 Python 的全栈 Web 框架,遵循 MTV 架构(Model‑Template‑View),对应通俗理解:
Django3 环境:Python3.6‑3.9,命令都是
django‑admin/python manage.py
# 安装
pip install django==3.2
# 创建项目 myproject
django-admin startproject myproject
# 进入项目文件夹
cd myproject
# 创建app,例如 blog
python manage.py startapp blog
# 启动开发服务器
python manage.py runserver
myproject/ # 项目根目录
├─ myproject/ # 项目配置文件夹
│ ├─ __init__.py
│ ├─ settings.py # ⭐全局配置文件(注册app、数据库、模板、中间件)
│ ├─ urls.py # ⭐主路由,总入口
│ ├─ asgi.py
│ └─ wsgi.py # 生产部署入口
├─ blog/ # app应用
│ ├─ migrations/ # 数据库迁移文件
│ ├─ __init__.py
│ ├─ admin.py # ⭐后台管理配置
│ ├─ apps.py
│ ├─ models.py # ⭐模型,数据库表定义
│ ├─ tests.py
│ ├─ urls.py # app子路由(自己新建)
│ └─ views.py # ⭐视图函数,业务逻辑
└─ manage.py # 项目命令行工具
重要第一步:新建的 app 必须在
settings.py的INSTALLED_APPS里注册!
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 注册自己的app
]
Django ORM:不用写 SQL,用 Python 类操作数据库,自动生成表。
blog/models.pyfrom django.db import models
class Article(models.Model):
# 字段
title = models.CharField(max_length=100, verbose_name="标题")
content = models.TextField(verbose_name="内容")
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
class Meta:
verbose_name = "文章"
verbose_name_plural = verbose_name
def __str__(self):
return self.title
常用字段
CharField(max_length):短字符串TextField:大文本IntegerField:整数DateTimeField
auto_now_add=True 创建时自动记录时间auto_now=True 每次修改自动更新时间BooleanField 布尔ForeignKey 外键(一对多)ManyToManyField 多对多修改 models 之后必须执行:
# 1.生成迁移文件,记录模型变更
python manage.py makemigrations
# 2.执行迁移,真正在数据库建表
python manage.py migrate
# 查所有
Article.objects.all()
# 条件查询
Article.objects.filter(title="xxx")
Article.objects.get(id=1) # 获取单条,不存在会抛异常
# 创建数据
Article.objects.create(title="第一篇", content="hello django")
# 修改
art = Article.objects.get(id=1)
art.title = "新标题"
art.save()
# 删除
art.delete()
默认 sqlite3(文件数据库,开发用);生产切换 MySQL。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
两种写法:函数视图 FBV(入门推荐)、类视图 CBV
from django.shortcuts import render, HttpResponse
def index(request):
# request:请求对象,包含GET/POST、cookie、session等
if request.method == "GET":
return HttpResponse("首页文字")
return HttpResponse("其他")
# 返回模板页面
def article_list(request):
articles = Article.objects.all()
# render渲染模板,第二个参数模板名,第三个传参字典
return render(request, "blog/article_list.html", {"article_list": articles})
request 对象常用:
request.method 请求方式 GET / POSTrequest.GET.get("key") 获取 url 参数request.POST.get("key") 获取表单 post 数据request.session 会话request.user 当前登录用户路由作用:url 地址 → 绑定视图函数
主路由 myproject/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')), # 引入app内部路由
]
app 子路由 blog/urls.py(手动新建)
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name="index"),
path('articles/', views.article_list, name="article_list"),
]
name:路由别名,模板中可以反向解析 url,硬编码地址解耦。
# urls.py
path('article/<int:aid>/', views.detail, name="detail")
# views.py
def detail(request, aid):
return HttpResponse(f"文章id:{aid}")
模板存放:默认在 app 下面新建 templates/blog/ 文件夹,放 html 文件。
Django 模板语言 DTL,在 HTML 中写模板语法。
{{ 变量 }}<!-- 渲染后台传过来的变量 -->
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
<ul>
{% for art in article_list %}
<li>{{ art.title }}</li>
{% empty %}
<li>暂无数据</li>
{% endfor %}
</ul>
{% if art.create_time %}
<span>{{ art.create_time }}</span>
{% else %}
<span>无时间</span>
{% endif %}
base.html 父模板
<!DOCTYPE html>
<html>
<body>
{% block content %}
<!-- 子页面填充这里 -->
{% endblock %}
</body>
</html>
子页面
{% extends "blog/base.html" %}
{% block content %}
<h2>文章列表</h2>
{% endblock %}
<!-- 使用路由name生成地址,不要写死url -->
<a href="{% url 'detail' aid=art.id %}">查看详情</a>
app 下新建 static/blog/,存放 css、js、图片
{% load static %}
<link rel="stylesheet" href="{% static 'blog/style.css' %}">
Django 自带后台,快速做数据管理页面。
python manage.py createsuperuser
blog/admin.py 注册模型,后台管理该表from django.contrib import admin
from .models import Article
admin.site.register(Article)
访问:/admin 登录,可以直接增删改数据库数据。
Django Form:校验表单数据、生成表单 html,forms.py
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ["title","content"]
内置 User 模型:用户表
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
# 校验账号密码
user = authenticate(username="xx", password="xx")
# 登录
login(request, user)
# 退出
logout(request)
模板判断是否登录:{% if user.is_authenticated %}
# 存
request.session["name"] = "张三"
# 取
name = request.session.get("name")
settings.py MIDDLEWAREsettings.py
STATIC_URL = '/static/' 静态文件访问前缀MEDIA_ROOT / MEDIA_URL 用户上传文件坑提醒:
{% load static %}。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。