这个需求很明确,就是基于一个现成的HTML模板(StartBootstrap Clean Blog)来快速搭建一个Django多人博客。核心在于将静态模板“Django化”,处理静态文件、模板继承和用户认证。
下面是一个最核心的实现骨架,帮你把模板集成进来并建立基础的文章模型。
1. 项目基础设置
首先,确保你的Django项目和应用已经创建好。假设项目名为 myblog,应用名为 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', # 你的博客应用
]
# 模板配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'], # 全局模板目录
'APP_DIRS': True,
...
},
]
# 静态文件配置 (CSS, JS, 图片)
STATIC_URL = 'static/'
STATICFILES_DIRS = [BASE_DIR / 'static'] # 开发阶段存放模板静态文件的地方
2. 处理静态模板文件
- 从StartBootstrap官网下载Clean Blog模板。
- 在你的项目根目录下创建
static 和 templates 文件夹。
- 将模板中的
css, js, img 等文件夹复制到 static 目录下。
- 将模板的HTML文件(如
index.html, post.html, about.html)复制到 templates 目录下。建议创建一个 blog 子目录来组织,比如 templates/blog/。
3. 创建核心模型
# blog/models.py
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
# 使用外键关联到Django内置的User模型,实现“多人”
author = models.ForeignKey(User, on_delete=models.CASCADE)
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.title
运行 python manage.py makemigrations 和 python manage.py migrate 创建数据库表。
4. 将静态HTML转换为Django模板
这是关键步骤。以首页 index.html 为例:
<!-- templates/blog/index.html -->
{% extends 'blog/base.html' %} <!-- 创建一个基础模板 -->
{% block content %}
{% for post in posts %}
<div class="post-preview">
<a href="{% url 'post_detail' pk=post.pk %}">
<h2 class="post-title">{{ post.title }}</h2>
<h3 class="post-subtitle">{{ post.content|truncatechars:100 }}</h3>
</a>
<p class="post-meta">
Posted by {{ post.author }} on {{ post.published_date }}
</p>
</div>
<hr>
{% endfor %}
{% endblock %}
创建一个基础模板 base.html,包含模板共用的头部、导航、脚部和静态文件引用。
<!-- templates/blog/base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
{% load static %}
<meta charset="utf-8">
<title>Clean Blog - {% block title %}{% endblock %}</title>
<!-- 使用static标签正确引用CSS -->
<link href="{% static 'css/clean-blog.min.css' %}" rel="stylesheet">
</head>
<body>
<!-- 导航栏等共用部分 -->
{% include 'blog/navbar.html' %}
<!-- 页面标题头 -->
<header class="masthead" style="background-image: url({% static 'img/home-bg.jpg' %})">
<div class="container">
<div class="row">
<div class="col-lg-8 col-md-10 mx-auto">
<div class="site-heading">
<h1>Clean Blog</h1>
<span class="subheading">A Django Blog Project</span>
</div>
</div>
</div>
</div>
</header>
<!-- 主要内容块 -->
<div class="container">
<div class="row">
<div class="col-lg-8 col-md-10 mx-auto">
{% block content %}
{% endblock %}
</div>
</div>
</div>
<!-- 页脚 -->
{% include 'blog/footer.html' %}
<!-- 使用static标签正确引用JS -->
<script src="{% static 'js/clean-blog.min.js' %}"></script>
</body>
</html>
5. 编写视图和URL
# blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_list(request):
posts = Post.objects.filter(published_date__isnull=False).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)
return render(request, 'blog/post_detail.html', {'post': post})
# 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'),
]
6. 实现“多人”功能(核心)
“多人”意味着用户认证和权限管理。Django内置了强大的 django.contrib.auth。
- 注册/登录/登出:直接使用Django内置的视图 (
auth_views.LoginView, LogoutView) 或自己写视图处理表单。
- 创建文章:在视图函数中检查
request.user.is_authenticated,只有登录用户才能访问。创建文章时,将 post.author = request.user。
- 编辑/删除文章:在视图或模板中检查当前登录用户是否是文章作者 (
if user == post.author) 来决定是否显示操作按钮。
# 一个简单的创建文章视图示例
from django.contrib.auth.decorators import login_required
@login_required
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})
总结一下步骤:1) 配置项目和应用;2) 放置模板静态文件;3) 定义Post模型;4) 用模板标签改造HTML;5) 写视图和URL;6) 利用auth系统实现用户登录和权限控制。
建议:先从实现文章列表和详情页开始,再逐步添加用户注册登录和文章管理功能。