1. 初识Django:从零开始搭建第一个Web应用
作为一名刚接触Django的开发者,完成第一个作业项目既令人兴奋又充满挑战。Django作为Python生态中最成熟的Web框架之一,以其"开箱即用"的特性著称。这个作业的核心目标是通过实践掌握Django的基础架构和开发流程。
我选择从创建一个简单的博客系统开始,这是理解Django核心概念的理想切入点。首先用django-admin startproject mysite创建项目骨架,这个命令会生成包含基础配置的目录结构。关键文件包括:
settings.py:项目的神经中枢,包含数据库配置、应用注册等urls.py:URL路由的入口文件wsgi.py:部署时与Web服务器交互的接口
新手常见误区:直接修改自动生成的文件而不备份。建议在重大修改前先复制一份原始文件。
2. 应用(APP)的创建与配置
2.1 创建第一个Django应用
在项目根目录下运行python manage.py startapp blog,这会在项目中创建一个名为blog的应用模块。新建的应用需要手动注册到项目中:
- 在
settings.py的INSTALLED_APPS列表中添加'blog.apps.BlogConfig' - 在项目主
urls.py中通过include()函数引入应用的路由配置
应用目录中的关键文件:
models.py:定义数据模型views.py:处理业务逻辑admin.py:配置后台管理界面migrations/:存放数据库迁移文件
2.2 模型设计要点
在models.py中定义博客文章模型时,我采用了Django的Model类继承方式:
python复制from django.db import models
from django.contrib.auth.models import User
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
模型字段选择经验:
- 短文本用
CharField并指定max_length - 长文本用
TextField - 时间戳推荐使用
auto_now_add自动记录创建时间 - 外键关系要明确指定
on_delete行为
3. 数据库迁移与管理员配置
3.1 执行数据库迁移
定义模型后,需要两步操作将模型同步到数据库:
- 生成迁移文件:
python manage.py makemigrations - 应用迁移:
python manage.py migrate
踩坑记录:如果在模型修改后遇到迁移失败,可以尝试删除迁移目录下的文件(除__init__.py外)和数据库文件,然后重新生成迁移。
3.2 配置超级用户与后台
Django自带强大的admin后台,配置步骤:
- 创建超级用户:
python manage.py createsuperuser - 在
admin.py中注册模型:
python复制from django.contrib import admin
from .models import Post
admin.site.register(Post)
- 访问
/admin即可看到管理界面
后台使用技巧:
- 通过
list_display控制列表页显示的字段 - 使用
search_fields添加搜索功能 - 用
list_filter添加侧边栏过滤器
4. 视图与URL路由配置
4.1 编写第一个视图函数
在views.py中创建显示文章列表的视图:
python复制from django.shortcuts import render
from .models import Post
def post_list(request):
posts = Post.objects.all().order_by('-created_at')
return render(request, 'blog/post_list.html', {'posts': posts})
视图编写要点:
- 每个视图函数至少接收
request参数 - 使用模型管理器的
all()、filter()等方法查询数据 render()函数将数据传递给模板
4.2 URL路由配置
在应用目录下新建urls.py:
python复制from django.urls import path
from . import views
urlpatterns = [
path('', views.post_list, name='post_list'),
]
然后在项目主urls.py中包含应用路由:
python复制from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
路由配置经验:
- 使用
name参数为路由命名,便于模板中引用 - 项目主路由通过
include()引入应用路由 - URL模式从上到下匹配,要把通用模式放在后面
5. 模板系统实战
5.1 创建基础模板
在应用目录下创建templates/blog/目录,新建base.html:
html复制<!DOCTYPE html>
<html>
<head>
<title>{% block title %}My Blog{% endblock %}</title>
</head>
<body>
<div id="content">
{% block content %}
{% endblock %}
</div>
</body>
</html>
5.2 文章列表模板
创建post_list.html继承基础模板:
html复制{% extends "blog/base.html" %}
{% block title %}Blog Posts{% endblock %}
{% block content %}
<h1>Blog Posts</h1>
{% for post in posts %}
<div class="post">
<h2>{{ post.title }}</h2>
<p>{{ post.content|truncatewords:30 }}</p>
<small>Posted by {{ post.author }} on {{ post.created_at }}</small>
</div>
{% endfor %}
{% endblock %}
模板使用技巧:
{% extends %}实现模板继承{% block %}定义可替换的内容区块- 使用过滤器如
truncatewords格式化输出 - 通过
{{ variable }}显示上下文变量
6. 表单处理与用户交互
6.1 创建文章表单
在应用目录下新建forms.py:
python复制from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
6.2 处理表单提交
扩展视图函数处理GET和POST请求:
python复制from django.shortcuts import render, redirect
from .forms import PostForm
def post_create(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('post_list')
else:
form = PostForm()
return render(request, 'blog/post_form.html', {'form': form})
表单处理要点:
- 区分请求方法处理逻辑
is_valid()验证表单数据commit=False允许在保存前修改模型实例- 成功提交后重定向避免重复提交
7. 静态文件管理与部署准备
7.1 配置静态文件
在settings.py中设置:
python复制STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
创建static/css/styles.css文件:
css复制.post {
margin-bottom: 20px;
padding: 15px;
border: 1px solid #ddd;
}
在模板中加载静态文件:
html复制{% load static %}
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
7.2 生产环境准备
关键设置调整:
- 设置
DEBUG = False - 配置
ALLOWED_HOSTS - 设置
STATIC_ROOT并运行collectstatic - 考虑使用PostgreSQL替代SQLite
开发服务器启动命令:
bash复制python manage.py runserver
8. 常见问题排查指南
8.1 模板找不到错误
症状:TemplateDoesNotExist异常
解决方法:
- 确保
settings.py中APP_DIRS为True - 检查模板路径是否为
templates/<appname>/ - 确认
INSTALLED_APPS中已注册应用
8.2 数据库连接问题
症状:OperationalError无法打开数据库
解决方法:
- 检查
settings.py中的DATABASES配置 - 确保有数据库文件的写入权限
- 尝试删除
db.sqlite3后重新迁移
8.3 静态文件404错误
症状:开发环境能看到静态文件但生产环境找不到
解决方法:
- 生产环境需要配置Web服务器(Apache/Nginx)处理静态文件
- 运行
python manage.py collectstatic - 检查
STATIC_ROOT和STATIC_URL设置
完成第一个Django作业后,我最大的体会是:不要试图一次性掌握所有功能。Django的"电池包含"哲学意味着它有大量内置功能,但作为初学者应该先聚焦核心流程 - 模型、视图、模板这个黄金三角。当遇到问题时,Django详细的错误信息和活跃的社区是最佳的学习资源。