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
相关产品推荐
相关产品推荐

