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

如何创建需管理员授权发布的Django模型表单及审核字段?

Django 管理员审核发布的模型表单实现方案

嘿,这两个问题本质上是一套解决方案,我来给你详细拆解下,都是实际项目里常用的套路~

一、有没有专门的管理员审核模型字段?

首先明确:Django没有专门的「审核字段」,但我们可以用内置的基础字段灵活实现这个功能,常用的有两种选择:

  • BooleanField:适合简单的「通过/未通过」场景,默认设为False(未审核)
  • CharField(带选项):适合更精细的状态管理,比如「待审核/已通过/已拒绝」,灵活性更高

我个人更推荐后者,因为能清晰区分不同状态,方便后续扩展(比如给用户显示审核进度)。

二、完整实现步骤

1. 先修改你的models.py,添加审核状态字段

假设你的孵化器广告模型叫IncubatorAd,我们给它加一个状态字段:

from django.db import models
from django.contrib.auth.models import User

class IncubatorAd(models.Model):
    # 你原有的字段:标题、内容、发布者等
    title = models.CharField(max_length=200, verbose_name="广告标题")
    content = models.TextField(verbose_name="广告内容")
    author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="发布用户")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="提交时间")
    
    # 新增审核状态字段
    STATUS_CHOICES = [
        ('pending', '待审核'),
        ('approved', '已通过'),
        ('rejected', '已拒绝'),
    ]
    status = models.CharField(
        max_length=10,
        choices=STATUS_CHOICES,
        default='pending',  # 默认提交后是待审核状态
        verbose_name="审核状态"
    )

    def __str__(self):
        return self.title

2. 创建用户提交的表单(隐藏审核状态)

用户提交广告时,绝对不能让他们修改审核状态,所以表单里只暴露用户需要填写的字段:

# forms.py
from django import forms
from .models import IncubatorAd

class IncubatorAdForm(forms.ModelForm):
    class Meta:
        model = IncubatorAd
        fields = ['title', 'content']  # 只让用户填标题和内容,status字段不显示

3. 处理表单提交的视图逻辑

用户提交表单后,自动关联当前登录用户,并且保持默认的「待审核」状态:

# views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required  # 要求用户登录才能提交
from .forms import IncubatorAdForm

@login_required
def submit_incubator_ad(request):
    if request.method == 'POST':
        form = IncubatorAdForm(request.POST)
        if form.is_valid():
            # 先不保存到数据库,先关联用户
            ad = form.save(commit=False)
            ad.author = request.user
            ad.save()  # 此时status默认是pending
            return redirect('ad_submit_success')  # 跳转到提交成功页面
    else:
        form = IncubatorAdForm()
    return render(request, 'submit_ad.html', {'form': form})

4. 配置Admin后台,让管理员能审核广告

在Admin后台里,我们要让管理员能看到所有广告的状态,并且批量审核:

# admin.py
from django.contrib import admin
from .models import IncubatorAd

@admin.register(IncubatorAd)
class IncubatorAdAdmin(admin.ModelAdmin):
    # 列表页显示的字段
    list_display = ('title', 'author', 'created_at', 'status')
    # 侧边栏过滤选项
    list_filter = ('status', 'created_at')
    # 批量操作按钮
    actions = ['approve_selected_ads', 'reject_selected_ads']

    # 批量通过广告
    def approve_selected_ads(self, request, queryset):
        queryset.update(status='approved')
    approve_selected_ads.short_description = "将选中的广告标记为【已通过】"

    # 批量拒绝广告
    def reject_selected_ads(self, request, queryset):
        queryset.update(status='rejected')
    reject_selected_ads.short_description = "将选中的广告标记为【已拒绝】"

5. 前端展示时,只显示已审核通过的广告

在展示广告的视图里,过滤出status='approved'的内容:

# views.py
def incubator_ad_list(request):
    # 只展示已通过审核的广告,按提交时间倒序
    approved_ads = IncubatorAd.objects.filter(status='approved').order_by('-created_at')
    return render(request, 'ad_list.html', {'ads': approved_ads})

额外小贴士

  • 如果你的需求很简单,只需要「通过/不通过」,可以把status换成BooleanField:
    is_approved = models.BooleanField(default=False, verbose_name="是否通过审核")
    
  • 可以给用户添加状态反馈,比如在用户中心显示他们提交的广告当前处于什么状态
  • 审核通过后可以给用户发邮件通知,用Django的send_mail功能就能实现

内容的提问来源于stack exchange,提问作者Arjun Kashyap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:03:42