当前位置: 首页 > news >正文

Django 完整项目开发:博客系统

下面我将提供一个详细的Django博客系统开发教程,包含模型设计、视图创建、模板渲染和用户认证等核心功能。

环境设置

首先确保你已安装Python(3.6+版本)和pip,然后按照以下步骤操作:

1. 创建虚拟环境并安装Django

bash

# 创建项目目录
mkdir django_blog
cd django_blog# 创建虚拟环境
python -m venv venv# 激活虚拟环境
# Windows:
venv\Scripts\activate
# Linux/Mac:
source venv/bin/activate# 安装Django
pip install django

2. 创建Django项目和应用

bash

# 创建项目
django-admin startproject blog_project .# 创建应用
python manage.py startapp blog

项目配置

1. 注册应用

编辑 blog_project/settings.py

python

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','blog',  # 添加这行
]

2. 配置数据库(使用SQLite默认配置)

python

DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}

3. 配置静态文件和模板

python

# 在文件末尾添加
STATIC_URL = '/static/'
STATICFILES_DIRS = [BASE_DIR / "static"]MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

定义模型

编辑 blog/models.py

python

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezoneclass Category(models.Model):name = models.CharField(max_length=100)def __str__(self):return self.nameclass Post(models.Model):title = models.CharField(max_length=200)content = models.TextField()author = models.ForeignKey(User, on_delete=models.CASCADE)category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)created_date = models.DateTimeField(default=timezone.now)published_date = models.DateTimeField(blank=True, null=True)def publish(self):self.published_date = timezone.now()self.save()def __str__(self):return self.titleclass Comment(models.Model):post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')author = models.CharField(max_length=100)text = models.TextField()created_date = models.DateTimeField(default=timezone.now)approved_comment = models.BooleanField(default=False)def approve(self):self.approved_comment = Trueself.save()def __str__(self):return self.text

创建并应用迁移

bash

python manage.py makemigrations
python manage.py migrate

创建管理员用户

bash

python manage.py createsuperuser
# 按照提示输入用户名、邮箱和密码

注册模型到管理员界面

编辑 blog/admin.py

python

from django.contrib import admin
from .models import Category, Post, Commentadmin.site.register(Category)
admin.site.register(Post)
admin.site.register(Comment)

创建视图

编辑 blog/views.py

python

from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from .models import Post, Comment
from .forms import CommentFormdef post_list(request):posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')return render(request, 'blog/post_list.html', {'posts': posts})def post_detail(request, pk):post = get_object_or_404(Post, pk=pk)if request.method == "POST":form = CommentForm(request.POST)if form.is_valid():comment = form.save(commit=False)comment.post = postcomment.save()return redirect('post_detail', pk=post.pk)else:form = CommentForm()return render(request, 'blog/post_detail.html', {'post': post, 'form': form})

创建表单

创建 blog/forms.py

python

from django import forms
from .models import Commentclass CommentForm(forms.ModelForm):class Meta:model = Commentfields = ('author', 'text')

配置URL路由

项目级URL配置(blog_project/urls.py):

python

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import staticurlpatterns = [path('admin/', admin.site.urls),path('', include('blog.urls')),
]if settings.DEBUG:urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

应用级URL配置(创建blog/urls.py):

python

from django.urls import path
from . import viewsurlpatterns = [path('', views.post_list, name='post_list'),path('post/<int:pk>/', views.post_detail, name='post_detail'),
]

创建模板

基础模板(templates/base.html):

html

<!DOCTYPE html>
<html>
<head><title>{% block title %}My Blog{% endblock %}</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body><nav class="navbar navbar-expand-lg navbar-dark bg-dark"><div class="container"><a class="navbar-brand" href="/">My Blog</a></div></nav><div class="container mt-4">{% block content %}{% endblock %}</div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

文章列表模板(blog/templates/blog/post_list.html):

html

{% extends 'base.html' %}{% block content %}<h1>Blog Posts</h1><hr>{% for post in posts %}<div class="card mb-4"><div class="card-body"><h2 class="card-title"><a href="{% url 'post_detail' pk=post.pk %}" class="text-decoration-none">{{ post.title }}</a></h2><p class="text-muted">Published on: {{ post.published_date|date:"D M Y" }}</p><p class="card-text">{{ post.content|truncatewords:30 }}</p><a href="{% url 'post_detail' pk=post.pk %}" class="btn btn-primary">Read More</a></div></div>{% endfor %}
{% endblock %}

文章详情模板(blog/templates/blog/post_detail.html):

html

{% extends 'base.html' %}{% block content %}<div class="post"><h1>{{ post.title }}</h1><p class="text-muted">Published on: {{ post.published_date|date:"D M Y" }}</p><p>{{ post.content|linebreaks }}</p></div><hr><h3>Comments</h3>{% for comment in post.comments.all %}{% if comment.approved_comment %}<div class="comment card mb-2"><div class="card-body"><strong>{{ comment.author }}</strong><p>{{ comment.text|linebreaks }}</p><p class="text-muted">{{ comment.created_date }}</p></div></div>{% endif %}{% empty %}<p>No comments yet.</p>{% endfor %}<h3>Add a comment</h3><form method="POST" class="post-form">{% csrf_token %}{{ form.as_p }}<button type="submit" class="btn btn-primary">Submit</button></form>
{% endblock %}

运行开发服务器

bash

python manage.py runserver

现在你可以访问:

  • 博客首页:http://127.0.0.1:8000/

  • 管理后台:http://127.0.0.1:8000/admin/

后续改进建议

  1. 添加用户认证系统(注册、登录、注销)

  2. 实现文章分类和标签功能

  3. 添加文章搜索功能

  4. 实现分页功能

  5. 添加富文本编辑器(如CKEditor)

  6. 实现文件上传功能

  7. 添加RSS订阅功能

  8. 部署到生产环境(使用Gunicorn和Nginx)

http://www.dtcms.com/a/389150.html

相关文章:

  • FPGA部署视觉模型
  • 课后实验实验拓扑:
  • 二阶段 docker 构建
  • React原理二
  • 116.block design 设计中设置的DDR起始地址的作用是什么
  • 报名中|2025 Maple 用户大会
  • 深入解析Channel:数据流动的秘密通道
  • 一键快速发布服务
  • 栈-394.字符串解码-力扣(LeetCode)
  • 【数据库】视图与表的区别:深入理解数据库中的虚拟表
  • 保障货物安全:商贸物流软件的实时追踪与风险预警机制​
  • 第二部分:VTK核心类详解(第23章 vtkInteractor交互器类)
  • 【LeetCode】45. 跳跃游戏 II
  • 【C++进阶】C++11的新特性—右值引用和移动语义
  • AssemblyScript 入门教程(4)AssemblyScript 编译器选项与高级应用指南
  • rust编写web服务09-分页与搜索API
  • 时空预测论文分享:元学习 神经架构搜索 动态稀疏训练 提示未来快照
  • 新服务器安装宝塔,发布前后端分离项目
  • [科普] 零中频发射架构的本振泄露校准技术
  • Linux系统安全加固的8个关键步骤
  • Java--多线程知识(三)
  • Qt QVBarModelMapper详解
  • 【学习】通义DeepResearch之WebWalker-让大模型“深度潜水”网页信息
  • Bsin-PaaS:企业级开源RWA解决方案的技术革新与实践
  • 贪心算法应用:装箱问题(FFD问题)详解
  • GO项目开发规范文档解读
  • 声明式导航VS编程式导航
  • Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
  • 华硕主板Z790 Windows11 + Linux (Ubuntu22.04) 双系统安装
  • 第二部分:VTK核心类详解(第24章 vtkWidget控件类系统)