恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

Django个人主页开发实战:从模型到Admin后台全解析

  • 首页
  • 资讯中心
  • /
  • Django个人主页开发实战:从模型到Admin后台全解析

相关资讯

用AccessibilityService复现李跳跳:从无障碍服务到自动跳过广告 2026/9/13 3:16:07
如何用 Docker 运行 9Router 官方镜像并把数据持久化到宿主机的 ~/.9router? 2026/9/13 3:16:07
OpenScreen 屏幕录制:免费无水印,3 步录出专业演示视频 2026/9/13 3:16:07

最新资讯

RAG技术解析:大模型应用开发与优化实战
贝叶斯优化驱动的车辆模型预测控制参数调优实战
XGBoost实战指南:从数学原理、数据预处理到代码调参
DApp开发进化论:从数字工具到链上自治理组织
充电宝ESD失效原理与整机防护实战指南
猫抓 cat-catch:如何 3 分钟把网页视频和 M3U8 流媒体变成可下载文件

今日推荐

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本周热门

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化
Flutter应用改名全指南:从Android到iOS的配置与工具实践

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

Django个人主页开发实战:从模型到Admin后台全解析

发布时间:2026/9/13 3:16:07
Django个人主页开发实战:从模型到Admin后台全解析 做Django教学这几年个人主页一直是我最喜欢推荐的实验选题。它不像博客系统那样有一堆评论、分页、标签的附加概念却能带你完整走一遍Web开发的黄金链路模型建表、视图取数、模板渲染、路由分发、后台维护。这篇就围绕【Django实验三个人主页开发实战】做一次完整复盘从项目初始化到admin后台配置再到高频报错的排查思路手把手把整条线串起来。适合刚学完Django基础、想动手做第一个完整项目的同学也适合带实验课的老师直接拿去当参考教案。这次实验的最终目标很简单打开浏览器能看到一个属于你自己的个人主页上面有个人信息、项目经历、最近文章并且所有内容都能通过Django自带的admin后台随时维护。听起来不复杂但要走完“数据入库-后台管理-前端展示”这一整条闭环涉及的Django知识点其实非常密集正好把前面的基础全部串一遍。1. 整体设计与实验目标拆解1.1 为什么说个人主页是恰到好处的Django实验我见过太多人学Django时一上来就照着网上教程写博客系统写到评论功能就开始崩溃。博客系统虽然经典但对新手并不友好用户认证、评论审核、分页搜索、分类标签每个模块单独拎出来都够写一篇教程全塞进一个实验里很容易变成“一行代码都没读懂CtrlC和CtrlV倒是练熟了”。个人主页项目就不一样它默认就是个人展示场景不需要复杂的用户体系不需要评论审核流核心就是“管理员在后台录入内容页面把它们展示出来”。这种模式恰好踩中Django最舒服的节奏——自带admin后台加模板渲染几乎不用额外造轮子。另外个人主页的展示效果很直观。你把头像、简介、项目列表这些内容做出来刷新页面就能看到变化正反馈来得特别快。学习这件事反馈快慢直接决定能坚持多久。1.2 实验MVP功能清单与选型决策这个实验我不建议一上来就把功能堆满先锁一个最小可用版本MVP后面再逐步加需求。我带的实验课通常选这三个模块个人信息展示姓名、头像、简介、邮箱、GitHub链接。项目经历列表标题、描述、技术栈、项目链接、是否展示。最近文章区块标题、正文、发布时间主页上只展示最近三篇。三个模块做下来Django的Model、View、Template、URL、Admin就全覆盖了正好构成一个完整的MVC闭环。技术选型上这个实验我坚持用Django默认的能力去做不额外引入Django REST Framework也不做前后端分离。原因很简单个人主页是典型的服务端渲染场景追求的是SEO和直出速度用模板引擎一把梭比搞一套API加前端框架划算得多。等以后项目复杂度上来再拆分前后端也不迟。数据库也先用默认的SQLite等真到了部署上线、多人并发的时候再切MySQL或者PostgreSQL不晚。2. 项目初始化虚拟环境、Django安装与app创建2.1 用venv做环境隔离为什么一定要做这一步很多初学者卡在第一个坑pip install django装了一堆版本过段时间另一个项目又装了不同版本结果两个项目互相踩连import django都报错。这问题几乎都是因为没做环境隔离。Django的惯例做法是用venv创建虚拟环境把每个项目的依赖装进独立的目录里互不干扰。这个实验我建议用Python 3.10以上的版本Django选择4.x或5.x都可以两者的核心用法在这个项目里没有明显差别。mkdir django_homepage cd django_homepage python3 -m venv venv source venv/bin/activate # Windows上执行 venv\Scripts\activate pip install django看到命令行前面多了(venv)前缀说明虚拟环境已经激活。这一步做完后面pip装的所有包都只属于这个项目不会污染全局Python环境。个人项目规模再小也建议养成这个习惯等服务端部署的时候requirements.txt一导出部署环境新拉一个虚拟环境一装很多版本冲突问题都能直接规避掉。2.2 创建项目与appstartproject和startapp到底干了什么环境准备好之后用两条命令就能生成项目骨架django-admin startproject config . python manage.py startapp home注意startproject后面我写的是config而不是常见的mysite。这是我个人的习惯项目配置目录名叫什么完全可以根据自己喜好来用config比用mysite语义上更清楚部署的时候一看目录名就知道这是存放全局配置的地方。命令末尾的那个点也很关键它的意思是“在当前目录下生成配置文件”不加这个点它会多建一层嵌套目录后面跑开发服务器容易搞混路径。很多人分不清startproject和startapp的区别。简单说startproject生成的是整个项目的配置中心比如settings.py、根URL配置、启动入口startapp生成的是一个具体的业务模块目录里面是models.py、views.py这些业务文件。一个Django项目可以包含多个app就像一套房子可以划分成好几个房间房间之间通过URL路由互相联通。生成完home这个app后第一件事就是把它注册到全局配置里。2.3 settings.py三个必改项app注册、模板路径、语言时区打开config/settings.py有几处是每次建项目都要改的关键位置。第一处是INSTALLED_APPS把home加进去。Django的app不用的时候没感觉少注册一个后面migrate时你写的表根本不会创建页面也会直接报TemplateDoesNotExist。第二处是TEMPLATES里的DIRS这个列表用来告诉Django“我自己的模板文件放在哪里”。默认值是一个空列表你需要这样配置TEMPLATES [ { BACKEND: django.template.backends.django.DjangoTemplates, DIRS: [BASE_DIR / templates], APP_DIRS: True, # ... 其他配置 }, ]然后在项目根目录下手动建一个templates文件夹。之所以要单独建一个全局模板目录是为了放base.html这类被多个app共享的基础模板。APP_DIRS设为True的意思是每个app内部的templates目录也会被自动扫描所以业务模块自己的页面文件比如home/templates/home/index.html不用额外配置就能被找到。第三处是语言和时区。Django默认的语言是en-us时区是UTC。对我们来说最直观的影响就是admin后台是英文时间显示会比东八区慢八个小时。改掉这两行LANGUAGE_CODE zh-hans TIME_ZONE Asia/Shanghai改完之后admin后台界面会自动变成中文时间显示也对得上了。另外还可以顺手把STATICFILES_DIRS配一下因为个人主页一定会用到CSS和图片STATIC_URL static/ STATICFILES_DIRS [BASE_DIR / static]对应的项目根目录下建一个static文件夹放静态资源。Django的静态文件机制官方文档写得很长但这套最小配置够用STATIC_URL是浏览器访问静态资源的URL前缀STATICFILES_DIRS是开发模式下Django帮你托管静态文件时要去哪些目录找文件。3. 模型设计与ORM实操从建表到数据增删改查3.1 三个核心模型个人信息、项目经历、文章个人主页的数据模型不复杂但这个环节是Django实验的重头戏字段类型选对了后面能省很多事。我在这份代码里把Django常用字段基本都覆盖了一遍from django.db import models class Profile(models.Model): name models.CharField(姓名, max_length50) avatar models.ImageField(头像, upload_toavatar/, blankTrue) bio models.TextField(个人简介) email models.EmailField(邮箱, blankTrue) github models.URLField(GitHub, blankTrue) created_at models.DateTimeField(创建时间, auto_now_addTrue) class Meta: verbose_name 个人信息 verbose_name_plural verbose_name def __str__(self): return self.name class Project(models.Model): profile models.ForeignKey(Profile, on_deletemodels.CASCADE, related_nameprojects, verbose_name所属人) title models.CharField(项目名称, max_length100) description models.TextField(项目描述) tech_stack models.CharField(技术栈, max_length200) url models.URLField(项目链接, blankTrue) published models.BooleanField(是否展示, defaultTrue) created_at models.DateTimeField(创建时间, auto_now_addTrue) class Meta: verbose_name 项目经历 verbose_name_plural verbose_name ordering [-created_at] def __str__(self): return self.title class Post(models.Model): title models.CharField(标题, max_length100) content models.TextField(正文) created_at models.DateTimeField(发布时间, auto_now_addTrue) class Meta: verbose_name 文章 verbose_name_plural verbose_name ordering [-created_at] def __str__(self): return self.title字段类型的选择其实就是在告诉数据库“这列数据长什么样”。CharField适合短文本必须指定max_lengthTextField没有长度限制适合放文章正文和简介EmailField和URLField会在admin后台自动做格式校验不用自己写正则ImageField加上upload_to参数后上传的图片会自动存到指定目录BooleanField用于控制项目是否在主页展示这个字段后面会频繁使用。每一个模型类里的created_at都设成auto_now_add意思是记录创建时自动写入当前时间这个细节能帮你省掉大量手动赋值时间的麻烦。3.2 迁移建表与admin注册模型和数据表之间的桥梁模型定义完成之后只是Python代码层面有了模型数据库里还没有真正的表。执行下面两条命令Django会对比模型和数据库的差异自动生成建表语句并执行python manage.py makemigrations python manage.py migratemakemigrations的作用是把模型的变化翻译成一个迁移文件migrate则是把迁移文件真正应用到数据库。官方教程喜欢把这一套流程讲得很严密实际操作层面你就记住以后每次改了models.py都要依次跑这两条命令缺一不可。忘了跑migrate最常见的报错是OperationalError: no such table: home_project看到这个错误第一反应肯定是“我模型写错了”其实只是你忘了同步数据库。为了让admin后台能管理这些数据还需要在home/admin.py里注册模型。Django默认的注册方式一行搞定from django.contrib import admin from .models import Profile, Project, Post admin.site.register(Profile) admin.site.register(Project) admin.site.register(Post)注册完还要创建管理员账号才能登录admin后台python manage.py createsuperuser按提示填写用户名、邮箱、密码然后启动开发服务器浏览器访问 http://127.0.0.1:8000/admin 就能看到中文后台登录页面了。3.3 ORM增删改查查询集的实际使用场景个人主页的数据展示无非三种操作查单条数据、查列表、按条件过滤。Django的ORM把SQL语法封装成了Python方法我用这个实验里的场景给你过一遍。在home目录下打开Django shell进行测试python manage.py shell# 查单条获取第一条个人信息 profile Profile.objects.first() # 查列表获取所有项目 projects Project.objects.all() # 过滤只查已发布的项目 published_projects Project.objects.filter(publishedTrue) # 过滤技术栈里包含Django关键字不区分大小写 django_projects Project.objects.filter(tech_stack__icontainsdjango) # 关联查询通过外键反向取某个人名下的所有项目 projects_of_zhang profile.projects.all() # 删除把不展示的项目删掉 Project.objects.filter(publishedFalse).delete() # 新增 Project.objects.create( profileprofile, title个人主页, description基于Django的个人主页项目, tech_stackDjango, SQLite, publishedTrue )ORM的查询集是惰性的filter查出来之后并不会立刻执行SQL只有你真正去遍历、取第一条、打印的时候才会查询数据库。理解这一点能帮你写出更高效的代码比如先filter再判断是否存在不会造成额外的一次数据库查询。删除操作要特别小心这里的delete是物理删除数据一旦删掉就不会回来了。我在带实验时反复强调生产环境千万不要直接调delete最好用软删除也就是给模型加一个is_active字段要隐藏数据就把它置为False。但在学习阶段你完全可以大胆地用delete去理解ORM的行为。4. 视图、路由与模板渲染让数据变成个人主页4.1 视图函数怎么写才清楚模型层把数据结构定义好了接下来要写视图把数据从数据库里取出来传给模板。Django的视图有两种写法函数视图和类视图。个人主页这种轻量场景函数视图看起来更直白也更容易理解请求处理流程。在home/views.py里写下第一个视图from django.shortcuts import render from .models import Profile, Project, Post def index(request): profile Profile.objects.first() projects Project.objects.filter(publishedTrue) recent_posts Post.objects.all()[:3] return render(request, home/index.html, { profile: profile, projects: projects, recent_posts: recent_posts, })render函数接收三个参数第一个是request请求对象第二是模板文件路径第三是传给模板的数据字典。这里有个细节Django优秀的点在于模板里直接写数据字典里的key就行不用像其他框架那样嵌套好几层上下文对象。如果没有查询到数据Profile.objects.first()会返回Noneprojects会返回一个空查询集。模板里针对这些情况做好容错处理页面就不会白屏报错。这算是Django视图开发里很实用的一个经验后端传数据时把空数据的可能性也考虑进去。4.2 路由命名与reverse/resolve反向解析的原理视图写完以后需要配置URL路由让浏览器访问某个地址时Django知道该调用哪个视图函数。项目级的配置文件config/urls.py负责总路由app内部也可以有自己的urls.py来管理模块内的路由典型做法是先在config/urls.py里include进app的配置from django.contrib import admin from django.urls import path, include urlpatterns [ path(admin/, admin.site.urls), path(, include(home.urls)), ]然后在home目录下新建urls.pyfrom django.urls import path from . import views app_name home urlpatterns [ path(, views.index, nameindex), ]path函数里那个name参数值得多说两句。它给这条路由起了个名字之后在模板里、重定向时、代码里都可以用这个名字反向生成URL不用硬编码路径。比如你在模板里写{% url home:index %}Django会解析成/以后就算把路径改成别的只要name不变所有引用这个地址的地方都不用改。对应的在Python代码里可以用reverse来反转URL。我在调试路由时经常配合resolve一起用一个负责反向解析出URL一个负责正向解析URL对应的是哪个视图from django.urls import reverse, resolve reverse(home:index) # 输出 / resolve(/) # 输出 ResolverMatch(funchome.views.index, ...)很多同学第一次接触反向解析都觉得多此一举直接写死路径不香吗但实际项目里URL路径频繁调整是常态用name来引用路径随便改代码不用动。这个设计思路贯穿Django全框架值得形成习惯。4.3 模板继承与列表渲染个人主页的骨架模板是Django和用户交互的最后一公里。个人主页的页面结构通常包含页头、内容区、页脚如果每个页面都复制一遍完整HTML改个版权信息都要打开所有模板改一遍维护成本太高。Django的模板继承机制正好解决这个问题。先写一个base.html把公共骨架固定在模板里{% load static %} !DOCTYPE html html langzh-hans head meta charsetUTF-8 title{% block title %}个人主页{% endblock %}/title link relstylesheet href{% static css/style.css %} /head body header nav a href{% url home:index %}首页/a /nav /header main {% block content %} {% endblock %} /main footer pcopy; 我的个人主页/p /footer /body /html然后写home/templates/home/index.html继承base.html只填充属于自己的内容块{% extends base.html %} {% block title %}首页{% endblock %} {% block content %} section classhero h1{{ profile.name }}/h1 {% if profile.avatar %} img src{{ profile.avatar.url }} alt头像 width120 {% endif %} p{{ profile.bio }}/p /section section classprojects h2项目经历/h2 {% for project in projects %} div classcard h3{{ project.title }}/h3 p{{ project.description }}/p span{{ project.tech_stack }}/span {% if project.url %} a href{{ project.url }} target_blank查看项目/a {% endif %} /div {% empty %} p还没有发布项目去admin后台添加吧。/p {% endfor %} /section section classposts h2最近文章/h2 {% for post in recent_posts %} article h3{{ post.title }}/h3 p{{ post.content|truncatechars:80 }}/p time{{ post.created_at|date:Y-m-d }}/time /article {% endfor %} /section {% endblock %}模板里的{% for %}标签负责循环列表数据{{ }}用来输出变量{% if %}用来做条件判断。这些看起来是模板语言的基础但组合起来可以完成大部分页面渲染工作。模板过滤器也很有用比如truncatechars可以截断过长的正文date可以格式化时间输出这些都能避免你在视图层额外加工数据。4.4 表单提交与重定向用messages传递提示个人主页如果只有查看功能缺少一点交互感。给主页加一个简单的留言表单是理解Django表单处理流程的好办法。既然不建用户系统就做一个不落地到数据库、只用session提示提交成功的版本。在home/views.py里新增from django.contrib import messages from django.shortcuts import redirect def contact(request): if request.method POST: name request.POST.get(name, 匿名) messages.success(request, f{name}留言已收到感谢你的来访) return redirect(home:index) return render(request, home/contact.html)这个视图的逻辑很典型先判断请求方法如果是POST说明用户提交了表单处理完业务后用redirect重定向到首页并通过messages框架在session里存一条提示消息。然后模板里就可以在合适的位置显示这条消息{% if messages %} ul classmessages {% for message in messages %} li{{ message }}/li {% endfor %} /ul {% endif %}这里有一个新手容易忽略的细节表单处理完一定要用redirect而不是直接render一个页面回去。直接render虽然也能展示内容但用户刷新页面时浏览器会重复提交上一次的POST请求造成重复的副作用操作。用redirect把请求变成一次全新的GET请求就规避了这个问题。这个模式在Web开发里叫Post/Redirect/Get是最基础但也最实用的开发规范之一。对应的在home/urls.py里补充路由给表单页起名为contactpath(contact/, views.contact, namecontact),然后在base.html导航栏加一个入口链接留言页就串起来了。5. Admin后台配置与界面美化思路5.1 list_display等后台配置让列表页更直观Django默认的admin后台注册模型之后就能增删改查但列表页只显示一条数据的字符串表示也就是__str__方法返回的内容。数据一多列表页看起来就非常费劲。这时候就该上ModelAdmin了。给Project模型配置一个更完整的列表管理类from django.contrib import admin from .models import Profile, Project, Post admin.register(Project) class ProjectAdmin(admin.ModelAdmin): list_display [title, tech_stack, published, created_at] search_fields [title, description] list_filter [published, created_at] ordering [-created_at] list_editable [published]list_display控制列表页显示哪些列search_fields会在列表页顶部生成一个搜索框list_filter会在右侧生成筛选面板ordering控制默认排序list_editable可以直接在列表页改布尔字段的值。加上这些配置以后admin后台的可用性会有一个质的提升你再也不用点进每一条数据去查看或修改状态了。这里有一个小坑list_editable里的字段不能和list_display里的第一个字段重复因为第一个字段默认是作为数据详情页的链接存在的两个功能会打架。我当时第一次配置时就是把title放进了list_editable结果直接报ValueError排查了好一会儿才意识到规则。5.2 admin美化从SimpleUI到自定义样式Django默认的admin界面功能很完善但视觉上确实属于“能用就行”的水平。个人主页这种带展示属性的项目如果想让后台也好看一点有两条路可以走。第一条路是装第三方主题最常用的就是django-simpleui。它的安装非常简单用pip安装后加到INSTALLED_APPS里要放在django.contrib.admin前面然后重启服务就能生效。SimpleUI会改造出类似现代管理后台的界面支持菜单折叠、主题切换几乎零成本就能让后台焕然一新。第二条路是自定义样式在static目录里写一个admin.css在base.html的head区域里用block引用。这种方法更自由但需要手写大量CSS覆盖Django默认样式维护成本比较高。如果只是为了自己维护数据方便我建议先用SimpleUI如果你对样式很敏感想要完全可控再走自定义路线也不迟。我用这个实验教学的时候通常只演示默认后台加list_display优化SimpleUI作为进阶内容。原因是默认后台的样子是Django内置的你对它越熟悉以后碰到其他项目遇到默认后台时就越有底。美化是锦上添花先把基础搞扎实。5.3 后台内容与前端页面的配合admin后台不是摆设它和前端页面的配合是这个实验的核心体验。录入一条项目数据前端主页立刻能看到这种即时反馈会让初学者觉得Django很“魔法”但背后的原理其实特别朴素admin后台写入数据库前端模板查询数据库两者通过模型层建立联系。实际动手时我建议的流程是先在admin后台录入完整的个人信息和三四条项目数据然后刷新主页看看数据展示是否符合预期。这个“录入-展示”的循环跑通Django的数据流就真正理解了。另外提醒一点后台录入数据时外键字段的体验值得关注。在admin新增Project时外键profile会渲染成一个下拉框如果下拉框里数据很多找起来会麻烦。这种情况下可以在ProjectAdmin里加autocomplete_fields对应的Profile模型需要配置search_fieldsadmin.register(Profile) class ProfileAdmin(admin.ModelAdmin): search_fields [name] admin.register(Project) class ProjectAdmin(admin.ModelAdmin): autocomplete_fields [profile]这样外键字段就变成了一个可搜索的选择框数据多了也方便定位。6. 高频报错与排查技巧实录6.1 静态文件404百分之八十是路径配置问题个人主页第一次引入CSS时会遇到一个典型问题明明static文件夹里放了style.css模板里也写了{% load static %}刷新页面却一直是404。排查思路通常是这样的第一步确认settings.py里有没有配STATICFILES_DIRS。如果是app内部的static目录APP_DIRS为True时会自动扫描但项目根目录下的全局static目录必须手动配置。第二步确认模板文件第一行有没有{% load static %}模板没有加载这个标签库{% static %}根本不会被解析。第三步确认浏览器缓存开发时经常改完CSS不生效强刷一下页面往往就好了。等以后部署到服务器上DEBUG变成False后还会遇到collectstatic的问题那是另一个话题。开发阶段只要把STATICFILES_DIRS配好静态文件基本不会出大乱子。6.2 NoReverseMatch报错先分清你是哪一种NoReverseMatch是Django新手报错排行榜里永远名列前茅的家伙个人主页这个项目里也经常遇到。它的报错信息通常会提示某个路由名称找不到常见原因有两类。第一类是名称写错了。模板里写的{% url home:index %}和urls.py里配置的name对不上。我排查这类问题的方法是直接打开Django shell跑一下reverse命令如果shell里能解析、模板里报错那问题多半出在模板文件的缓存或者拼写上。第二类是命名空间不对。app的urls.py里如果没写app_name home你在模板里就不能用冒号前面的home:前缀。写不写app_name决定了Django如何组织路由命名空间。在带实验时我还见过一种隐蔽的报错path转换器写错了。比如路由是path(project/int:pk/, views.project_detail)模板里却传了一个字符串类型的{% url home:project_detail project.pk %}如果pk本身不是数字会解析失败。这种问题一般看报错信息里提示的额外线索就能定位。6.3 mysqlclient安装失败Windows环境的重灾区虽然这个实验默认用SQLite但很多同学的课程设计或后续项目会要求用MySQL。在Windows环境装mysqlclient几乎是必踩的坑因为它在pip安装时会尝试编译原生代码缺少编译环境就直接报一堆红色错误。我的建议是分情况处理。如果能装系统依赖或Visual Studio Build Tools那可以去安装预编译的wheel包如果不想折腾编译环境可以换用pymysql在settings.py里配置import pymysql pymysql.install_as_MySQLdb()这样Django就能用MySQL驱动连接数据库了。不过这个实验本身的数据量很小SQLite完全够用。我一直建议教学阶段除非数据库操作是实验目标之一否则优先用SQLite它能帮你把注意力集中在Django本身的机制上而不是被数据库驱动的安装问题拖住。6.4 时区不对一个settings配置引发的八小时误差刚开始做个人主页时你会发现Post的created_at显示的时间比当前时间慢了八个小时。时间看起来对不上通常是TIME_ZONE没设置或者USE_TZ设置不合适。Django官方文档的建议是配置TIME_ZONE为Asia/ShanghaiUSE_TZ保持True这样Django会在存储时使用UTC显示时自动转换到本地时区。如果你不关心国际化只是个人项目也可以在settings.py里把USE_TZ设为False这样Django存储和使用的时候都直接用本地时间避免各种转换导致的困惑。不过要注意设置了USE_TZ之后模板里用|date:Y-m-d过滤器格式化时间时Django会自动把UTC时间转成TIME_ZONE指定的本地时间所以时区设置在这种情况下是能正常显示的。真正常见的问题是admin后台显示的录入时间你在下午三点录入的文章后台却显示上午七点这时候优先检查TIME_ZONE有没有设置再去检查数据库连接配置。写在最后的实验心得带这个实验带了三轮之后我最大的体会是个人主页这类项目真正的难点从来不在Django本身而在于你想做的效果和框架提供的默认能力之间如何取舍。比如你非要给头像加个裁剪上传那就得去啃django-imagekit你想做瀑布流就得想清楚怎么给模板传数据。我现在的建议是先跑通最朴素的版本——数据能从admin录入、能在页面展示、路由不报错再一步步加需求。这个过程走完你对Django的全局认知比刷十遍教程都管用。最后再分享一个实际操作中的小技巧开发的时候把settings里的DEBUG保持为True模板改完浏览器直接刷新看效果不用频繁重启runserver。Django开发服务器自带自动重载只有改了settings或新增了文件才需要手动重启。记住这句话能帮你省下不少无效等待的时间。

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号