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

Django技术需求:实现点击禁用按钮将用户is_active设为False

修正用户禁用功能的完整方案

我来帮你梳理下当前代码的问题,然后给出可行的修正方案:

1. 模型层的问题修正

你的User模型里的block_profile方法有两个明显问题:一是self本身就是当前User实例,不需要再取self.user;二是模型方法不该直接处理request、messages和redirect——这些属于视图层的职责,模型只该专注于数据操作逻辑。

修改后的models.py:

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

class User(AbstractUser):
    # 这里放你的自定义字段,比如:
    # bio = models.TextField(blank=True, verbose_name="个人简介")
    
    def block_user(self):
        # 仅负责修改用户激活状态,纯数据逻辑
        self.is_active = False
        self.save()

2. 视图层新增禁用处理逻辑

当前的user_list视图只负责展示列表,缺少处理禁用请求的逻辑。我们需要新增一个视图来处理POST请求,完成禁用操作:

# views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .models import User, Profile

def user_list(request):
    # 用select_related关联User和Profile,优化数据库查询性能
    profiles = Profile.objects.select_related('user').all()
    return render(request, "vstories/vstories.html", {'profiles': profiles})

@login_required  # 确保只有登录用户能操作,还可添加管理员权限验证
def block_user(request, user_id):
    if request.method == 'POST':
        # 获取目标用户,不存在则返回404页面
        target_user = get_object_or_404(User, id=user_id)
        target_user.block_user()
        messages.success(request, 'Profile successfully disabled.')
    # 操作完成后重定向回用户列表
    return redirect('user_list')

3. 添加URL路由

在项目的urls.py里新增禁用用户的路由:

from django.urls import path
from . import views

urlpatterns = [
    path('users/', views.user_list, name='user_list'),
    path('users/block/<int:user_id>/', views.block_user, name='block_user'),
]

4. 模板调整:添加禁用按钮表单

模板里的「禁用用户」按钮需要用POST表单提交,同时带上CSRF令牌防止跨站攻击:

<!-- vstories/vstories.html -->
{% extends 'base.html' %}

{% block content %}
<h2>用户列表</h2>
<div class="user-list">
    {% for profile in profiles %}
    <div class="user-item">
        <span>{{ profile.user.username }} - {{ profile.user.email }}</span>
        <!-- 禁用用户的表单 -->
        <form action="{% url 'block_user' profile.user.id %}" method="POST" style="display: inline-block; margin-left: 10px;">
            {% csrf_token %}
            <button type="submit" onclick="return confirm('确定要禁用这个用户吗?');">
                禁用用户
            </button>
        </form>
    </div>
    {% empty %}
    <p>暂无用户数据</p>
    {% endfor %}
</div>
{% endblock %}

额外优化建议

  • 如果仅允许管理员禁用用户,可以在block_user视图里添加权限校验:
    from django.core.exceptions import PermissionDenied
    
    @login_required
    def block_user(request, user_id):
        if not request.user.is_superuser:
            raise PermissionDenied
        # 后续逻辑...
    
  • 可以在后台管理页面给User模型的is_active字段添加更清晰的状态显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:41:59