You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Admin中编辑博客文章,完成前不对外公开?

在Django Admin中实现博客文章草稿功能(定稿前不公开)

当然可以实现,核心思路是给博客文章加状态标识,区分「草稿」和「已发布」,然后在前端展示逻辑中过滤掉草稿状态的内容,同时让管理员能在后台自由编辑草稿并预览。

1. 给博客模型添加状态字段

修改你的博客模型文件(models.py),新增一个可选状态的字段:

from django.db import models

class BlogPost(models.Model):
    # 定义状态选项
    STATUS_CHOICES = (
        ('draft', '草稿'),
        ('published', '已发布'),
    )
    title = models.CharField(max_length=200)
    content = models.TextField()
    # 默认设为草稿状态
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

2. 配置Django Admin支持状态编辑

在admin.py中配置后台显示和编辑状态字段,方便管理员切换:

from django.contrib import admin
from .models import BlogPost

@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
    # 列表页显示关键信息
    list_display = ('title', 'status', 'created_at')
    # 增加状态筛选器
    list_filter = ('status', 'created_at')
    search_fields = ('title', 'content')
    # 编辑页分组展示字段
    fieldsets = (
        ('基础内容', {
            'fields': ('title', 'content')
        }),
        ('发布设置', {
            'fields': ('status',)
        }),
    )

3. 前端视图过滤已发布文章

修改展示文章的视图(views.py),只向普通用户返回「已发布」状态的文章:

from django.shortcuts import render, get_object_or_404
from django.http import Http404
from .models import BlogPost

def blog_list(request):
    # 仅展示已发布的文章
    published_posts = BlogPost.objects.filter(status='published').order_by('-created_at')
    return render(request, 'blog/list.html', {'posts': published_posts})

def blog_detail(request, post_id):
    post = get_object_or_404(BlogPost, id=post_id)
    # 非管理员用户无法访问草稿文章
    if post.status != 'published' and not request.user.is_staff:
        raise Http404("该文章不存在或未发布")
    return render(request, 'blog/detail.html', {'post': post})

4. 可选:后台添加草稿预览功能

如果需要管理员在后台直接预览草稿,可在BlogPostAdmin中添加自定义预览按钮:

from django.urls import reverse
from django.utils.html import format_html

@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
    # 保留之前的配置...
    list_display = ('title', 'status', 'created_at', 'preview_link')

    def preview_link(self, obj):
        if obj.pk:
            detail_url = reverse('blog_detail', args=[obj.pk])
            return format_html('<a href="{}" target="_blank">预览草稿</a>', detail_url)
        return '-'
    preview_link.short_description = '预览操作'

这样管理员可以在后台编辑草稿,定稿后切换为「已发布」状态,普通用户就会看到文章了;未发布的草稿只有管理员能预览和编辑。

内容的提问来源于stack exchange,提问作者David Henson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:32:11