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

Django中通过HTML模板而非后台为用户分配用户组

嘿,我来帮你搞定这个Django用户组分配的需求!咱们一步步来实现,确保只有Admin组用户能操作,同时让每个用户旁边都有下拉框可以分配组:

1. 先给页面加上权限控制

首先得确保只有“Admin Users”组的用户能访问这个页面。Django提供了很方便的装饰器来做这个:

from django.contrib.auth.decorators import user_passes_test
from django.shortcuts import render, redirect
from django.contrib.auth.models import User, Group

# 定义权限检查函数
def is_admin_user(user):
    return user.is_authenticated and user.groups.filter(name='Admin Users').exists()

@user_passes_test(is_admin_user)
def manage_user_groups(request):
    # 后续视图逻辑写在这里
    pass

如果你习惯用类视图,也可以用UserPassesTestMixin来实现:

from django.views.generic import TemplateView
from django.contrib.auth.mixins import UserPassesTestMixin

class ManageUserGroupsView(UserPassesTestMixin, TemplateView):
    template_name = 'manage_user_groups.html'

    def test_func(self):
        return self.request.user.groups.filter(name='Admin Users').exists()
2. 视图里准备数据并处理提交逻辑

接下来在视图里获取所有用户和可用组,同时处理表单提交的更新逻辑:

@user_passes_test(is_admin_user)
def manage_user_groups(request):
    users = User.objects.all().order_by('username')
    # 可以指定只显示你需要的组,比如Admin和Staff
    groups = Group.objects.filter(name__in=['Admin Users', 'Staff Users'])

    if request.method == 'POST':
        # 遍历提交的用户组数据
        for key in request.POST:
            if key.startswith('group_'):
                user_id = key.split('_')[1]
                try:
                    user = User.objects.get(id=user_id)
                    group_id = request.POST[key]
                    # 用set()会替换用户现有组,若要添加组可改用add()
                    if group_id:
                        user.groups.set([Group.objects.get(id=group_id)])
                    else:
                        user.groups.clear()
                except (User.DoesNotExist, Group.DoesNotExist):
                    # 简单的错误处理,也可以用messages提示
                    pass
        # 添加成功提示
        from django.contrib import messages
        messages.success(request, '用户组已成功更新!')
        return redirect('manage_user_groups')

    context = {
        'users': users,
        'groups': groups
    }
    return render(request, 'manage_user_groups.html', context)
3. 编写模板展示用户和下拉选择框

创建模板manage_user_groups.html,循环展示所有用户,每个用户旁配一个下拉框:

{% extends 'base.html' %}

{% block content %}
<h2>管理用户组</h2>
<form method="post">
    {% csrf_token %}
    <div class="table-responsive">
        <table class="table table-striped">
            <thead>
                <tr>
                    <th>用户名</th>
                    <th>当前所属组</th>
                    <th>分配新组</th>
                </tr>
            </thead>
            <tbody>
                {% for user in users %}
                <tr>
                    <td>{{ user.username }}</td>
                    <td>
                        {% if user.groups.all %}
                            {{ user.groups.first.name }}
                        {% else %}
                            <em>未分配任何组</em>
                        {% endif %}
                    </td>
                    <td>
                        <select name="group_{{ user.id }}" class="form-select">
                            <option value="">-- 请选择组 --</option>
                            {% for group in groups %}
                            <option value="{{ group.id }}" {% if group in user.groups.all %}selected{% endif %}>
                                {{ group.name }}
                            </option>
                            {% endfor %}
                        </select>
                    </td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
    <button type="submit" class="btn btn-primary">保存所有更改</button>
</form>
{% endblock %}
4. 配置页面路由

最后在你的urls.py里添加这个页面的路由:

from django.urls import path
from .views import manage_user_groups

urlpatterns = [
    # 其他路由...
    path('manage-user-groups/', manage_user_groups, name='manage_user_groups'),
]

额外小提示

  • 如果你想让表单更优雅,可以引入django-crispy-forms来美化样式;
  • 若需要批量操作,也可以改用ModelFormSet来实现更专业的批量编辑;
  • 可以给模板加一些交互反馈,比如加载状态、错误提示等,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:12:20