PyCharm + Django 完整入门教程
本教程将涵盖以下核心步骤:

- 环境准备: 安装 Python 和 PyCharm。
- 项目创建: 使用 PyCharm 创建一个新的 Django 项目。
- 应用创建: 在项目中创建一个用于博客的 Django 应用。
- 模型定义: 创建一个
Post模型来存储文章数据。 - 后台管理: 注册模型到 Django Admin,方便管理数据。
- 视图编写: 编写处理业务逻辑的视图函数。
- URL 配置: 设置 URL 路由,将 URL 映射到视图。
- 模板创建: 创建 HTML 模板来展示页面。
- 静态文件处理: 添加 CSS 样式。
- 数据迁移与服务器运行: 将模型变更同步到数据库并启动项目。
第一步:环境准备
在开始之前,请确保你已经安装了以下软件:
- Python: 从 Python 官网 下载并安装,安装时请勾选 "Add Python to PATH" 选项。
- PyCharm: 从 JetBrains 官网 下载并安装。
- 强烈推荐使用 PyCharm Professional Edition (专业版),因为它对 Django 的支持更完善(如数据库工具、模板调试等),社区版也可以完成本教程,但某些高级功能不可用。
第二步:创建 Django 项目
-
打开 PyCharm,点击
File->New Project。 -
在弹出的窗口中:
- Name: 输入你的项目名称,
myblog。 - Location: 选择项目存放的位置。
- New environment using: 选择
Virtualenv,这会为你的项目创建一个独立的虚拟环境,避免不同项目之间的依赖冲突。 - Base interpreter: 确保指向你安装的 Python 解释器。
- Django: 勾选这个复选框,PyCharm 会自动为你配置好 Django 项目结构。
- Application name: 输入初始应用的名称,
main。
- Name: 输入你的项目名称,
-
点击
Create,PyCharm 会自动完成以下操作:
(图片来源网络,侵删)- 创建一个虚拟环境。
- 安装 Django 包。
- 生成标准的 Django 项目文件和目录。
项目创建后,你会看到如下的目录结构:
myblog/
├── myblog/ # 项目配置目录
│ ├── __init__.py
│ ├── asgi.py
│ ├── settings.py # 核心配置文件
│ ├── urls.py # 项目主 URL 配置
│ └── wsgi.py
├── manage.py # Django 命令行工具
└── venv/ # 虚拟环境目录
第三步:创建 Django 应用
一个 Django 项目可以包含多个应用,我们将创建一个专门用于博客的应用。
- 在 PyCharm 的右下角,找到
Terminal(终端) 标签并点击打开。 - 在终端中,输入以下命令来创建一个名为
blog的应用:python manage.py startapp blog
- 执行后,项目根目录下会多出一个
blog文件夹。
我们需要告诉 Django 这个新应用的存在,打开 myblog/settings.py 文件,找到 INSTALLED_APPS 列表,将 'blog' 添加进去:
# myblog/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 在这里添加你的应用
]
第四步:定义模型
模型是数据库中数据的唯一、权威的信息源,我们将创建一个 Post 模型来存储文章标题、内容、作者和发布时间。

- 打开
blog/models.py文件,将其内容修改为:
# blog/models.py
from django.db import models
from django.contrib.auth.models import User # 引入内置的 User 模型
class Post(models.Model):= models.CharField(max_length=200, verbose_name='标题')
content = models.TextField(verbose_name='内容')
author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')
def __str__(self):
return self.title
class Meta:
verbose_name = '文章'
verbose_name_plural = '文章'
verbose_name: 在后台管理中显示的中文名称。__str__: 定义对象的字符串表示形式,方便在后台识别。
第五步:后台管理
为了让 Django Admin 能够管理我们新创建的 Post 模型,我们需要在 blog/admin.py 中注册它。
- 打开
blog/admin.py文件,修改为:
# blog/admin.py
from django.contrib import admin
from .models import Post
@admin.register(Post) # 使用装饰器注册模型
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'author', 'created_at') # 在列表页显示的字段
list_filter = ('created_at', 'author') # 过滤器
search_fields = ('title', 'content') # 搜索字段
raw_id_fields = ('author',) # 作者字段使用搜索框
第六步:数据迁移
将我们定义的模型同步到数据库中。
-
在 PyCharm 的
Terminal中,依次执行以下两条命令:# 1. 生成迁移文件 python manage.py makemigrations # 2. 应用迁移,创建数据表 python manage.py migrate
你会看到 Django 为你创建了一系列数据表,包括我们自定义的
blog_post表。
第七步:创建超级用户
为了登录后台管理系统,我们需要创建一个管理员账户。
- 在
Terminal中运行:python manage.py createsuperuser
- 按照提示输入:
- Username: 用户名
- Email address: 邮箱地址
- Password: 密码 (输入时不会显示)
- Password (again): 确认密码
第八步:运行服务器并测试后台
- 在
Terminal中运行:python manage.py runserver
- 打开你的浏览器,访问
http://127.0.0.1:8000/admin/。 - 使用你刚刚创建的超级用户名和密码登录。
- 登录后,你应该能看到 "BLOG" 应用,点击 "Posts",你就可以在这里添加、修改和删除文章了,先手动创建几篇文章,方便后续测试。
第九步:编写视图
视图是接收 Web 请求并返回响应的 Python 函数,我们将创建三个视图:文章列表、文章详情和创建文章。
- 打开
blog/views.py,编写以下代码:
# blog/views.py
from django.shortcuts import render, get_object_or_404, redirect
from .models import Post
from django.utils import timezone
from .forms import PostForm # 我们将在下一步创建这个表单
def post_list(request):
posts = Post.objects.filter(created_at__lte=timezone.now()).order_by('-created_at')
return render(request, 'blog/post_list.html', {'posts': posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
def post_new(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_detail', pk=post.pk)
else:
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})
def post_delete(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == "POST":
post.delete()
return redirect('post_list')
return render(request, 'blog/post_confirm_delete.html', {'post': post})
post_list: 获取所有已发布的文章并按创建时间倒序排列。post_detail: 根据pk(主键) 获取单篇文章。post_new: 处理文章创建表单的提交。post_delete: 处理文章的删除。
第十步:创建表单
为了方便创建文章,我们需要一个表单。
- 在
blog目录下新建一个forms.py文件,并添加以下内容:
# blog/forms.py
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title', 'content')
第十一步:配置 URL
URLconf 是 Django 项目的目录,它像网站的“目录”一样,将 URL 路径映射到相应的视图。
-
在项目的主
urls.py(myblog/urls.py) 中引入blog应用的 URL:# myblog/urls.py from django.contrib import admin from django.urls import path, include # 引入 include urlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')), # 所有开头的请求都交给 blog.urls 处理 ] -
在
blog应用中创建一个urls.py文件:在
blog目录上右键 ->New->Python File,命名为urls.py。# blog/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.post_list, name='post_list'), # 首页 -> 文章列表 path('post/<int:pk>/', views.post_detail, name='post_detail'), # 文章详情 path('post/new/', views.post_new, name='post_new'), # 新建文章 path('post/<int:pk>/delete/', views.post_delete, name='post_delete'), # 删除文章 ]name='...'给 URL 起了个名字,方便在模板中反向解析。
第十二步:创建模板
模板是 HTML 文件,其中包含一些特殊的 Django 标签和变量,用于动态生成页面。
-
在
blog应用下创建模板目录结构:- 在
blog目录上右键 ->New->Directory,命名为templates。 - 在
templates目录上右键 ->New->Directory,命名为blog。 - 最终路径应为:
blog/templates/blog/。
- 在
-
创建
base.html(基础模板): 在blog/templates/blog/目录下创建base.html,其他模板会继承这个基础模板,以保持网站风格一致。<!-- blog/templates/blog/base.html --> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>{% block title %}我的博客{% endblock %}</title> <style> body { font-family: sans-serif; margin: 40px; } .container { max-width: 800px; margin: 0 auto; } nav a { margin-right: 15px; text-decoration: none; color: #007bff; } nav a:hover { text-decoration: underline; } .post { border: 1px solid #ccc; padding: 15px; margin-bottom: 20px; border-radius: 5px; } .post h2 { margin-top: 0; } .post-meta { color: #666; font-size: 0.9em; } </style> </head> <body> <div class="container"> <nav> <a href="{% url 'post_list' %}">首页</a> {% if user.is_authenticated %} <a href="{% url 'post_new' %}">写新文章</a> {% endif %} </nav> <hr> {% block content %} {% endblock %} </div> </body> </html> -
创建
post_list.html(文章列表页): 在blog/templates/blog/目录下创建post_list.html。<!-- blog/templates/blog/post_list.html --> {% extends 'blog/base.html' %} {% block title %}文章列表 - 我的博客{% endblock %} {% block content %} <h1>所有文章</h1> {% for post in posts %} <div class="post"> <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2> <div class="post-meta"> 作者: {{ post.author }} | 发布于: {{ post.created_at|date:"Y-m-d H:i" }} </div> </div> {% empty %} <p>暂无文章。</p> {% endfor %} {% endblock %} -
创建
post_detail.html(文章详情页): 在blog/templates/blog/目录下创建post_detail.html。<!-- blog/templates/blog/post_detail.html --> {% extends 'blog/base.html' %} {% block title %}{{ post.title }} - 我的博客{% endblock %} {% block content %} <article class="post"> <h1>{{ post.title }}</h1> <div class="post-meta"> 作者: {{ post.author }} | 发布于: {{ post.created_at|date:"Y-m-d H:i" }} </div> <hr> <p>{{ post.content|linebreaksbr }}</p> </article> {% if user == post.author %} <a href="{% url 'post_delete' pk=post.pk %}">删除这篇文章</a> {% endif %} {% endblock %} -
创建
post_edit.html(新建/编辑文章页): 在blog/templates/blog/目录下创建post_edit.html。<!-- blog/templates/blog/post_edit.html --> {% extends 'blog/base.html' %} {% block title %}{% if form.instance.pk %}编辑文章{% else %}新建文章{% endif %} - 我的博客{% endblock %} {% block content %} <h1>{% if form.instance.pk %}编辑文章{% else %}新建文章{% endif %}</h1> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">保存</button> </form> {% endblock %} -
创建
post_confirm_delete.html(删除确认页): 在blog/templates/blog/目录下创建post_confirm_delete.html。<!-- blog/templates/blog/post_confirm_delete.html --> {% extends 'blog/base.html' %} {% block title %}确认删除 - 我的博客{% endblock %} {% block content %} <h1>你确定要删除 "{{ post.title }}" 吗?</h1> <form method="post"> {% csrf_token %} <button type="submit">确认删除</button> <a href="{% url 'post_detail' pk=post.pk %}">取消</a> </form> {% endblock %}
第十三步:运行和测试
- 确保你的开发服务器正在运行 (
python manage.py runserver)。 - 在浏览器中访问
http://127.0.0.1:8000/。- 你应该能看到你在后台创建的所有文章列表。
- 点击文章标题,可以进入详情页。
- 如果你以超级用户身份登录,你会在导航栏看到“写新文章”的链接,点击它可以创建新文章。
- 在文章详情页,如果你是文章作者,你会看到“删除这篇文章”的链接。
进阶提示
- PyCharm 的 Django Console: 在 PyCharm 右下角,你可以找到
Django Console,它是一个已经配置好 Django 环境的 Python 交互式控制台,你可以直接在里面执行Post.objects.all()这样的代码来调试。 - 数据库工具: PyCharm Professional 版提供了强大的数据库工具,你可以在右下角的
Database标签页中直接连接和操作你的 SQLite 数据库,非常方便。 - 静态文件: 在
settings.py中配置STATIC_URL和STATICFILES_DIRS,在生产环境中,你需要使用python manage.py collectstatic来收集所有静态文件到一个地方。 - 调试: 在代码的任意一行行号左侧点击,可以设置断点,然后以
Debug模式运行服务器(点击工具栏上的虫子图标),程序会在断点处暂停,你可以查看变量值,单步执行,是调试代码的利器。
恭喜你!你已经成功使用 PyCharm 和 Django 从零开始构建了一个功能完整的博客应用,这个项目涵盖了 Django 开发的核心流程,是学习 Django 的绝佳起点。
