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/
后续改进建议
-
添加用户认证系统(注册、登录、注销)
-
实现文章分类和标签功能
-
添加文章搜索功能
-
实现分页功能
-
添加富文本编辑器(如CKEditor)
-
实现文件上传功能
-
添加RSS订阅功能
-
部署到生产环境(使用Gunicorn和Nginx)