Python编程:从入门到实践(第3版)

> 📖 **一起读书吧!** 加入《Python编程:从入门到实践》共读营 👉 [点击参加](https://mp.weixin.qq.com/s/ehe2vMrfAFscRLqbM9TF-g)

项目介绍

Django 开发一个完整的学习笔记网站——"Learning Log"!用户可以注册账号、创建学习主题、记录学习条目。

你将学会

  • ✅ Django项目搭建 + App创建
  • ✅ Topic 和 Entry 数据模型
  • ✅ 用户注册、登录、登出(第2版新增
  • ✅ 创建、编辑、删除条目
  • ✅ Bootstrap样式(第2版更新到Bootstrap 5
  • ✅ 部署上线(第2版更新部署方式

原书对应章节:第18-20章


第1步:安装Django

1
2
pip install django
python -m django --version

第2步:创建项目和App

1
2
3
4
5
# 创建项目
django-admin startproject learning_log .

# 创建App
python manage.py startapp learning_logs

第3步:模型定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# learning_logs/models.py
from django.db import models
from django.contrib.auth.models import User

class Topic(models.Model):
"""学习主题"""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE)

def __str__(self):
return self.text

class Entry(models.Model):
"""学习条目"""
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
text = models.TextField()
date_added = models.DateTimeField(auto_now_add=True)

class Meta:
verbose_name_plural = 'entries'

def __str__(self):
return f"{self.text[:50]}..."

运行迁移:

1
2
python manage.py makemigrations learning_logs
python manage.py migrate

第4步:Django管理后台

1
2
3
4
5
6
# learning_logs/admin.py
from django.contrib import admin
from .models import Topic, Entry

admin.site.register(Topic)
admin.site.register(Entry)

创建超级用户:

1
python manage.py createsuperuser

访问 http://127.0.0.1:8000/admin/ 管理数据。

第5步:视图函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# learning_logs/views.py
from django.shortcuts import render, get_object_or_404
from django.contrib.auth.decorators import login_required
from .models import Topic, Entry

def index(request):
return render(request, 'learning_logs/index.html')

@login_required
def topics(request):
topics = Topic.objects.filter(owner=request.user).order_by('date_added')
context = {'topics': topics}
return render(request, 'learning_logs/topics.html', context)

@login_required
def topic(request, topic_id):
topic = get_object_or_404(Topic, id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)

第6步:用户认证(第2版新增)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# users/views.py
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm

def register(request):
if request.method != 'POST':
form = UserCreationForm()
else:
form = UserCreationForm(data=request.POST)
if form.is_valid():
new_user = form.save()
login(request, new_user)
return redirect('learning_logs:index')
context = {'form': form}
return render(request, 'users/register.html', context)

第7步:URL配置

1
2
3
4
5
6
7
8
# learning_log/urls.py
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('users.urls')),
path('', include('learning_logs.urls')),
]

第8步:模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!-- base.html -->
<!DOCTYPE html>
<html>
<head>
<title>Learning Log</title>
<!-- Bootstrap 5 -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="{% url 'learning_logs:index' %}">Learning Log</a>
{% if user.is_authenticated %}
<span class="navbar-text">Hello, {{ user.username }}</span>
{% endif %}
</nav>
<div class="container mt-4">
{% block content %}{% endblock %}
</div>
</body>
</html>

第9步:部署(Render/ Railway/ Fly.io)

第2版改用现代部署平台(如 Render):

1
2
3
4
5
6
7
# requirements.txt
Django>=4.2
psycopg2-binary

# 构建命令
pip install -r requirements.txt
python manage.py collectstatic

Django官方部署文档:https://docs.djangoproject.com/en/stable/howto/deployment/


项目文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
learning_log/
├── manage.py
├── requirements.txt
├── learning_log/ # 项目配置
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── learning_logs/ # 笔记App
│ ├── __init__.py
│ ├── admin.py
│ ├── models.py
│ ├── views.py
│ └── urls.py
├── users/ # 用户App(第2版新增)
│ ├── __init__.py
│ ├── views.py
│ └── urls.py
└── templates/
├── base.html
└── learning_logs/
├── index.html
├── topics.html
└── topic.html

📚 官方文档参考


🎓 AI 编程实战课程

程序员晚枫专注AI编程培训,通过 《30讲 · AI编程训练营》,让小白也能用AI做出实际项目。