Django表单下拉框仅显示登录用户所属分部的选项
解决方案
要实现创建Profile时仅显示登录用户所属的分部,可按以下步骤修改代码:
1. 调整表单类,动态过滤分部选项
在forms.py中给ProfileForm添加初始化方法,接收当前用户并筛选division字段的可选范围:
class ProfileForm(ModelForm): class Meta: model = models.Profile fields = ('division', 'name') widgets = { 'division': forms.Select(attrs={'class':'form-control'}), 'name': forms.TextInput(attrs={'class':'form-control'}) } def __init__(self, *args, **kwargs): # 从参数中取出用户对象,默认值为None self.user = kwargs.pop('user', None) super().__init__(*args, **kwargs) # 若用户已登录,只显示该用户关联的分部 if self.user and self.user.is_authenticated: self.fields['division'].queryset = self.user.division_set.all()
2. 修改视图,实例化表单时传入当前用户
在views.py的AddProfile视图中,实例化表单时带上request.user参数:
def AddProfile(request): submitted = False if request.method == "POST": form = forms.ProfileForm(request.POST, user=request.user) if form.is_valid(): form.save() return HttpResponseRedirect('profile?submitted=true') else: form = forms.ProfileForm(user=request.user) if 'submitted' in request.GET: submitted = True return render(request,'profiles/create/create_profile.html', {'form': form, 'submitted': submitted})
额外优化(可选)
如果需要限制只有登录用户才能访问该创建页面,可给视图添加登录验证装饰器:
from django.contrib.auth.decorators import login_required @login_required def AddProfile(request): # 原视图代码
内容的提问来源于stack exchange,提问作者chrisg06
相关产品推荐
相关产品推荐

