86_Python Django框架入门 Python Django框架入门MTV架构、ORM与Admin管理台文章目录Python Django框架入门MTV架构、ORM与Admin管理台前言一、安装与项目创建二、Django的MTV架构三、创建第一个应用四、定义模型Model常用字段类型五、数据库迁移六、视图函数View七、URL路由配置八、模板渲染Template九、Admin管理后台总结✅ 亮点总结适用场景扩展方向前言如果说Flask是微框架那Django就是全栈框架的王者。Django遵循不重复造轮子DRY: Don’t Repeat Yourself的哲学内置了ORM、模板引擎、表单处理、认证系统、管理后台等企业级功能。它的MTV架构Model-Template-View提供了清晰的分层结构让大型项目的代码组织变得井井有条。无论是快速原型还是大型Web应用Django都能胜任——Instagram、Pinterest、Disqus 这些亿级用户的网站最初都是用Django搭建的。本文将从项目创建开始带你掌握Django的核心概念与基本用法。什么时候选Django而不是Flask如果你需要在一个月内交付一个包含用户注册登录、内容管理后台、权限控制、数据库管理的完整系统选Django——这些功能Django已经内置好了。如果只是做一个简单的API服务或微型网站选Flask——部署更快、概念更少。一句话概括Django是开箱即用的全家桶Flask是按需组装的工具箱。一、安装与项目创建pipinstalldjango# 创建项目django-admin startproject myblogcdmyblog执行后生成如下结构myblog/ ├── manage.py # 项目管理入口不可修改 ├── myblog/ │ ├── __init__.py │ ├── settings.py # 全局配置 │ ├── urls.py # URL路由入口 │ ├── asgi.py # ASGI配置 │ └── wsgi.py # WSGI配置manage.py是Django的命令行工具所有操作启动服务器、创建应用、数据库迁移等都通过它完成。二、Django的MTV架构Django的分层结构被称为MTV模式。理解这个架构是使用Django的关键——它定义了代码应该放在哪里的问题浏览器请求 → URL路由器(urls.py) → 视图(views.py) → 模型(models.py) ⇄ 数据库 ↓ 模板(templates) → HTML响应Model模型定义数据结构与数据库表对应通过ORM操作数据。这是数据的来源和归宿。Template模板负责页面展示的HTML文件Django模板引擎支持变量、循环、继承。注意Django模板和Flask的Jinja2非常相似——因为Jinja2的设计就是受到Django模板引擎的启发。View视图核心业务逻辑层接收请求、调用Model获取数据、选择Template渲染、返回响应。它是Model和Template之间的调度者。这本质上与MVCModel-View-Controller是同一思想只是Django中View更接近ControllerTemplate才对应MVC的View。三、创建第一个应用Django项目由多个**App应用**组成每个App负责一个功能模块python manage.py startapp blog这会生成blog/目录blog/ ├── __init__.py ├── admin.py # 管理后台注册 ├── apps.py # 应用配置 ├── models.py # 数据模型 ├── views.py # 视图函数 ├── urls.py # 需要手动创建 └── migrations/ # 数据库迁移文件重要创建App后需要在settings.py中注册# myblog/settings.pyINSTALLED_APPS[django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib.sessions,django.contrib.messages,django.contrib.staticfiles,blog,# 添加你的应用]四、定义模型Model模型是Django的核心一个模型类对应数据库中的一张表。Django ORM会根据模型类的定义自动生成对应的SQL建表语句——你只需要定义Python类数据库操作交给Django。理解模型的字段类型和参数选项是Django开发的基本功。ORM的核心优势不需要在不同数据库MySQL/PostgreSQL/SQLite之间切换SQL方言。models.CharField(max_length50)在MySQL中生成VARCHAR(50)在PostgreSQL中同样生成VARCHAR(50)你的代码无需修改一行就能切换数据库引擎。这在项目初期用SQLite快速开发、后期迁移到PostgreSQL的典型场景中极其方便。# blog/models.pyfromdjango.dbimportmodelsfromdjango.utilsimporttimezoneclassCategory(models.Model):文章分类namemodels.CharField(max_length50,uniqueTrue,verbose_name分类名称)created_atmodels.DateTimeField(auto_now_addTrue,verbose_name创建时间)classMeta:verbose_name分类verbose_name_plural分类ordering[-created_at]def__str__(self):returnself.nameclassArticle(models.Model):文章STATUS_CHOICES[(draft,草稿),(published,已发布),]titlemodels.CharField(max_length200,verbose_name标题)contentmodels.TextField(verbose_name内容)categorymodels.ForeignKey(Category,on_deletemodels.CASCADE,related_namearticles,verbose_name分类)authormodels.CharField(max_length50,default匿名,verbose_name作者)statusmodels.CharField(max_length10,choicesSTATUS_CHOICES,defaultdraft,verbose_name状态)created_atmodels.DateTimeField(auto_now_addTrue,verbose_name创建时间)updated_atmodels.DateTimeField(auto_nowTrue,verbose_name更新时间)view_countmodels.IntegerField(default0,verbose_name阅读量)classMeta:verbose_name文章verbose_name_plural文章ordering[-created_at]def__str__(self):returnself.title常用字段类型字段类型说明使用场景CharField短文本标题、用户名TextField长文本文章内容、简介IntegerField整数计数、年龄FloatField/DecimalField浮点数价格、评分BooleanField布尔值是否激活、开关DateTimeField日期时间创建时间、更新时间ForeignKey外键多对一文章-分类ManyToManyField多对多文章-标签EmailField邮箱用户邮箱auto_now_addTrue表示创建时自动设置当前时间auto_nowTrue表示每次保存时自动更新。五、数据库迁移定义好模型后需要生成并执行迁移文件# 生成迁移文件python manage.py makemigrations blog# 查看迁移对应的SQLpython manage.py sqlmigrate blog 0001# 应用迁移同步到数据库python manage.py migrate六、视图函数View视图函数接收HTTP请求返回HTTP响应# blog/views.pyfromdjango.shortcutsimportrender,get_object_or_404,redirectfromdjango.httpimportJsonResponsefrom.modelsimportArticle,Categorydefindex(request):文章列表页articlesArticle.objects.filter(statuspublished).order_by(-created_at)[:10]returnrender(request,blog/index.html,{articles:articles})defarticle_detail(request,pk):文章详情页articleget_object_or_404(Article,pkpk,statuspublished)article.view_count1article.save(update_fields[view_count])# 只更新阅读量字段returnrender(request,blog/detail.html,{article:article})defarticles_by_category(request,category_id):按分类查看文章categoryget_object_or_404(Category,pkcategory_id)articlescategory.articles.filter(statuspublished)returnrender(request,blog/category.html,{category:category,articles:articles})get_object_or_404是一个便捷函数——如果对象不存在自动抛出404而非500错误。七、URL路由配置Django的路由需要两层配置项目级和App级# myblog/urls.py (项目级)fromdjango.contribimportadminfromdjango.urlsimportpath,include urlpatterns[path(admin/,admin.site.urls),path(,include(blog.urls)),# 引入blog应用的路由]# blog/urls.py (应用级需手动创建)fromdjango.urlsimportpathfrom.importviews urlpatterns[path(,views.index,nameblog_index),path(article/int:pk/,views.article_detail,namearticle_detail),path(category/int:category_id/,views.articles_by_category,namecategory_articles),]路由中的name参数给URL起了一个别名在模板中可以使用{% url blog_index %}引用这样URL变化时不需要改动模板。八、模板渲染TemplateDjango默认在App目录下的templates/目录中查找模板。创建blog/templates/blog/base.html!DOCTYPEhtmlhtmllangzh-CNheadmetacharsetUTF-8title{% block title %}我的博客{% endblock %}/title/headbodyheaderh1ahref{% url blog_index %}我的博客/a/h1/headermain{% block content %}{% endblock %}/mainfooterpcopy;2025 Django博客/p/footer/body/html!-- blog/templates/blog/index.html --{% extends blog/base.html %} {% block title %}首页 - 我的博客{% endblock %} {% block content %}h1最新文章/h1{% for article in articles %}articleh2ahref{% url article_detail article.pk %}{{ article.title }}/a/h2p作者: {{ article.author }} | 分类: {{ article.category.name }}/pp阅读量: {{ article.view_count }}/pp发布于: {{ article.created_at|date:Y-m-d H:i }}/p/articlehr{% empty %}p暂无文章/p{% endfor %} {% endblock %}九、Admin管理后台Django Admin是免费午餐里最美味的一道菜——这是Django社区流传最广的一句话。几行配置代码就能得到一个功能齐全的后台管理系统数据列表展示、字段搜索、分类筛选、日期层级导航、在线编辑……如果你曾经手写过后台CRUD页面写HTML表单、写查询SQL、写翻页逻辑……你就会明白Django Admin到底帮你省了多少时间。Admin背后的设计哲学Django Admin不是给终端用户用的而是给开发者和管理员用的内容管理工具。它不是用来替代前端面向客户的页面而是作为数据管理的开发后台。在项目早期Admin可以充当快速的数据输入界面在中后期它可以作为运营人员管理数据的补充工具。很多Django项目的Admin页面直接被赋予了运营后台的职能。# blog/admin.pyfromdjango.contribimportadminfrom.modelsimportCategory,Articleadmin.register(Category)classCategoryAdmin(admin.ModelAdmin):list_display[name,created_at]search_fields[name]admin.register(Article)classArticleAdmin(admin.ModelAdmin):list_display[title,category,author,status,view_count,created_at]list_filter[status,category,created_at]search_fields[title,content]list_editable[status]# 列表页直接可编辑list_per_page20date_hierarchycreated_at创建超级用户后访问/admin/python manage.py createsuperuser启动服务器python manage.py runserver访问http://127.0.0.1:8000/admin/登录后就能管理所有模型数据。总结本文带你走完了Django开发的完整流程创建项目→新建应用→定义模型→数据库迁移→编写视图→配置路由→渲染模板→激活Admin。Django的全栈特性让你可以在一个框架内完成从前端到后端的所有开发工作。MTV架构虽然名字特殊但本质是对传统MVC的Django式表达。下一篇文章我们将深入Django模型与数据库探索ORM的高级查询技巧和复杂的关联关系。✅ 亮点总结Django的MTV架构Model-Template-View覆盖了从数据库到前端的全栈开发能力startprojectstartapp命令快速搭建项目骨架免去手动创建目录和配置文件的繁琐ORM模型只需定义Python类makemigrationsmigrate自动完成数据库表的创建和变更内置Admin后台是Django的杀手级功能——几行代码即可获得功能完整的数据库管理界面URL配置采用集中式管理配合include()实现模块化路由项目结构清晰可控适用场景内容管理系统CMS用Django快速构建博客、新闻门户、知识库等内容驱动型网站企业级Web应用ERP、CRM、OA等内部系统利用Admin后台和权限系统快速交付快速原型交付在时间紧迫的需求验证阶段Django的全栈特性让你以惊人速度产出可用产品扩展方向Django中间件机制学习如何编写自定义中间件实现请求拦截、日志记录和性能监控Admin后台深度定制掌握ModelAdmin的高级配置实现列表过滤、自定义操作和富文本编辑推荐阅读下一篇《Django模型与数据库》深入ORM的高级查询和复杂关联关系Django的口号是The web framework for perfectionists with deadlines它的内置功能确实让开发者能以惊人速度交付产品。