1. Django第一次作业:从零搭建基础项目框架
刚接触Django的新手常会陷入一个误区——直接跳进代码编写而忽略项目结构的规划。我在带教实习生时发现,90%的"第一次作业"出现的问题都源于初始配置不当。这次我们就从工程化角度,拆解一个标准Django项目的搭建流程。
Django作为Python生态中最成熟的全栈框架,其"开箱即用"的特性背后是严格的约定优于配置(Convention Over Configuration)哲学。这意味着正确的初始化操作能避免后续80%的诡异报错。下面这个经过20+项目验证的搭建流程,特别适合作为第一次作业的实践模板。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与项目创建
2.1 Python环境配置
推荐使用Python 3.8+版本,这是目前Django 4.x的黄金组合。通过以下命令检查环境:
bash复制python --version
pip --version
如果系统同时存在Python 2和3,请使用python3和pip3明确指定版本。我强烈建议使用虚拟环境隔离项目依赖:
bash复制python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate.bat # Windows
2.2 Django安装与验证
在激活的虚拟环境中执行:
bash复制pip install django==4.2.3
安装完成后,用这个冷门但实用的命令验证安装:
bash复制python -m django --version
注意:不要直接运行django-admin命令验证版本,某些系统环境变量配置可能导致误判
3. 项目骨架生成
3.1 创建标准项目结构
使用Django标准命令生成项目骨架:
bash复制django-admin startproject core .
这个命令有几个关键细节:
- 末尾的点号表示在当前目录创建,避免产生嵌套目录
- 项目名建议使用core/config等通用名,而非具体业务名
- 生成的manage.py应该位于项目根目录
正确的目录结构应该是:
code复制myproject/
├── core/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
3.2 基础配置调整
立即修改settings.py中的三个关键配置:
python复制# 安全配置
DEBUG = False # 开发时可暂时为True
ALLOWED_HOSTS = ['*'] # 生产环境必须修改
# 时区设置
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
踩坑提醒:新手常忽略ALLOWED_HOSTS配置,导致后期部署时出现400 Bad Request错误
4. 应用(APP)创建与管理
4.1 创建第一个APP
Django的项目(Project)和应用(App)是两种不同概念。运行:
bash复制python manage.py startapp articles
建议按功能模块划分APP,例如:
- users: 用户管理
- articles: 内容管理
- comments: 评论系统
4.2 注册APP到项目
在settings.py的INSTALLED_APPS中添加:
python复制INSTALLED_APPS = [
'django.contrib.admin',
...
'articles.apps.ArticlesConfig', # 推荐使用这种显式注册方式
]
经验之谈:不要直接写'app名',而是使用apps.py中的配置类,便于后期扩展
5. 模型定义与数据库迁移
5.1 设计第一个模型
在articles/models.py中定义:
python复制from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Article(models.Model):
STATUS_CHOICES = [
('draft', '草稿'),
('published', '已发布'),
]
title = models.CharField(max_length=200, verbose_name='标题')
content = models.TextField(verbose_name='内容')
author = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
5.2 执行数据库迁移
依次运行:
bash复制python manage.py makemigrations
python manage.py migrate
常见问题:如果遇到"no changes detected"错误,检查是否已正确注册APP
6. 管理员界面配置
6.1 创建超级用户
bash复制python manage.py createsuperuser
按提示输入用户名、邮箱和密码。这里有个实用技巧:
bash复制echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'admin@example.com', 'password')" | python manage.py shell
可以跳过交互式提示直接创建账号。
6.2 注册模型到Admin
在articles/admin.py中添加:
python复制from django.contrib import admin
from .models import Article
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'status', 'created_at')
list_filter = ('status', 'created_at')
search_fields = ('title', 'content')
7. 视图与URL配置
7.1 编写第一个视图
在articles/views.py中:
python复制from django.shortcuts import render
from .models import Article
def article_list(request):
articles = Article.objects.filter(status='published')
return render(request, 'articles/list.html', {'articles': articles})
7.2 配置URL路由
先在core/urls.py中包含应用路由:
python复制from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('articles/', include('articles.urls')),
]
然后在articles目录下新建urls.py:
python复制from django.urls import path
from . import views
urlpatterns = [
path('', views.article_list, name='article_list'),
]
8. 模板系统配置
8.1 创建模板目录
项目根目录下新建:
code复制templates/
base.html
articles/
list.html
修改settings.py配置模板路径:
python复制TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
},
]
8.2 编写基础模板
templates/base.html:
html复制<!DOCTYPE html>
<html>
<head>
<title>{% block title %}My Site{% endblock %}</title>
</head>
<body>
<header>项目导航</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>© 2023</footer>
</body>
</html>
templates/articles/list.html:
html复制{% extends "base.html" %}
{% block title %}文章列表{% endblock %}
{% block content %}
<h1>文章列表</h1>
<ul>
{% for article in articles %}
<li>{{ article.title }} - {{ article.author }}</li>
{% endfor %}
</ul>
{% endblock %}
9. 运行与调试
9.1 启动开发服务器
bash复制python manage.py runserver
访问 http://127.0.0.1:8000/articles/ 查看效果
9.2 调试技巧
-
遇到报错时,先检查:
- 是否已执行迁移?
- 是否注册了APP?
- 模板路径是否正确?
-
使用Django的调试页面:
- 确保settings.py中DEBUG=True
- 页面会显示完整错误堆栈和局部变量
-
查看SQL查询:
在settings.py中添加:
python复制LOGGING = {
'version': 1,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'level': 'DEBUG',
'handlers': ['console'],
},
},
}
10. 作业常见问题解决方案
10.1 用户认证问题
当看到"请输入正确的用户名和密码"提示时:
- 确认已创建超级用户
- 检查是否开启了Session中间件
- 验证密码是否正确(区分大小写)
10.2 静态文件404
如果CSS/JS无法加载:
- 创建static目录
- 在settings.py中配置:
python复制STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
10.3 ORM查询异常
常见查询问题解决方法:
python复制# 获取单个对象
Article.objects.get(id=1) # 不存在时抛出DoesNotExist
# 过滤查询
Article.objects.filter(title__contains='Django')
# 排除查询
Article.objects.exclude(status='draft')
# 复杂查询
from django.db.models import Q
Article.objects.filter(Q(status='published') | Q(author=request.user))
11. 项目结构优化建议
11.1 合理的目录规划
成熟Django项目推荐结构:
code复制project/
├── apps/ # 所有应用目录
│ ├── articles/
│ └── users/
├── config/ # 原core目录
├── static/ # 静态文件
├── templates/ # 全局模板
├── requirements/ # 依赖文件
│ ├── base.txt
│ ├── dev.txt
│ └── prod.txt
└── manage.py
11.2 配置分离技巧
创建settings包代替单文件:
code复制config/
├── settings/
│ ├── __init__.py
│ ├── base.py
│ ├── dev.py
│ └── prod.py
└── __init__.py
通过环境变量切换配置:
bash复制export DJANGO_SETTINGS_MODULE=config.settings.dev
12. 进阶学习路线
完成基础搭建后,建议按以下顺序深入:
- 用户认证系统(django.contrib.auth)
- 表单处理(Form/ModelForm)
- 类视图(Class-based Views)
- REST框架(Django REST Framework)
- 异步任务(Celery + Redis)
- 性能优化(缓存/查询优化)
我在实际项目中发现,初期建立正确的项目结构和开发习惯,能为后续开发节省至少30%的调试时间。特别是合理的APP划分和配置管理,在项目规模扩大后会显现出巨大优势。
