如何创建需管理员授权发布的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
相关产品推荐
相关产品推荐

