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

Django实现添加用户时仅显示登录用户所属组

解决方案

要实现注册新用户时下拉框仅显示当前登录用户所属组的需求,只需修改表单和视图代码,具体步骤如下:

1. 调整表单类(forms.py)

在表单初始化方法中接收当前用户,动态过滤组的查询集,仅保留该用户所属的组:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import Group, User

class UserRegisterForm(UserCreationForm):
    group = forms.ModelChoiceField(queryset=Group.objects.none(), required=True)  # 初始设为空查询集

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')  # 获取传入的当前登录用户
        super().__init__(*args, **kwargs)
        # 替换查询集为当前用户所属的组
        self.fields['group'].queryset = user.groups.all()

    class Meta:
        model = User
        fields = ['username', 'password1', 'password2', 'group']

2. 更新视图函数(views.py)

实例化表单时,将当前登录用户request.user传递给表单:

from .forms import UserRegisterForm
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, render

@login_required(login_url='login')      
def addUser(request):
    if request.method == 'POST':
        # POST请求时需传入当前用户,保证验证逻辑一致
        form = UserRegisterForm(request.POST, user=request.user)
        if form.is_valid():
            user = form.save()
            group = form.cleaned_data['group']        
            group.user_set.add(user)
            return redirect('login')
    else:
        # GET请求时传入当前用户,初始化过滤后的下拉选项
        form = UserRegisterForm(user=request.user)
    return render(request, 'base/adduser.html', {'form':form})

关键说明

  • 表单初始化时通过kwargs.pop('user')获取当前用户,将group字段的查询集替换为user.groups.all(),确保下拉框仅展示该用户所属的组。
  • GET和POST请求都需要传入user=request.user,避免POST验证时因查询集不一致导致的表单错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:45:23