Python中如何使用Django基于startbootstrap-clean-blog模板开发多人博客练手项目

这几天学习 Django,准备写一个简单的博客项目,由于不会写前端,所以只好到处物色好看的模板,最后在 startbootstrap 上找到了 startbootstrap-clean-blog 这个模板,感觉十分不错,就用了这个模板来写

https://github.com/AnyISalIn/clean_django_blog, 求 star

支持功能

  • 登录
  • 注册
  • 在线编辑(markdown)
  • 分类标签

todo

  • 实时 markdown 预览
  • 更好的 markdown 渲染
  • 权限控制
  • 用户页面

demo

在线 demo, 部署在 heroku

home tag detail editor


Python中如何使用Django基于startbootstrap-clean-blog模板开发多人博客练手项目

8 回复

没人回复。。。。


这个需求很明确,就是基于一个现成的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. 处理静态模板文件

  1. 从StartBootstrap官网下载Clean Blog模板。
  2. 在你的项目根目录下创建 statictemplates 文件夹。
  3. 将模板中的 css, js, img 等文件夹复制到 static 目录下。
  4. 将模板的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 makemigrationspython 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系统实现用户登录和权限控制。

建议:先从实现文章列表和详情页开始,再逐步添加用户注册登录和文章管理功能。

消灭 0 回复

不错,帮顶。

界面很不错啊,赞一个

clone 了一下, 可用, sqlite3.
不过离 production 还要走好一段距离.

可以用 postgresql

我的 MayBlog 也是用 django 写的,页面也是用的 clean blog

https://github.com/flyhigher139/mayblog

回到顶部