如何在Django UpdateView中筛选特定关联Team数据?
解决Django UpdateView中Team下拉框仅展示对应公司数据的问题
步骤1:修改视图传递公司UUID到表单
在views.py的UpdateProfileView中重写get_form_kwargs方法,将URL中的company_uuid参数传递给表单:
class UpdateProfileView(SuccessMessageMixin, UpdateView): model = Profile form_class = UpdateProfileForm template_name = 'users/management/update_profile.html' success_message = 'Változtatások mentve' def get_success_url(self): return self.request.META.get('HTTP_REFERER') def get_form_kwargs(self): kwargs = super().get_form_kwargs() # 从URL参数中获取company_uuid并传递给表单 kwargs['company_uuid'] = self.kwargs.get('uuid') return kwargs
步骤2:修改表单过滤Team选项
在表单文件(如forms.py)中,重写表单的__init__方法,根据传递的company_uuid过滤team01的下拉选项:
from django import forms from .models import Profile, Company, Team class UpdateProfileForm(forms.ModelForm): class Meta: model = Profile fields = ['company', 'team01'] # 替换为你实际需要的字段列表 def __init__(self, *args, **kwargs): # 取出传递的company_uuid参数,不传递给父类初始化 company_uuid = kwargs.pop('company_uuid', None) super().__init__(*args, **kwargs) if company_uuid: try: # 根据UUID找到对应的公司 target_company = Company.objects.get(company_uuid=company_uuid) # 过滤Team选项,仅保留当前公司的团队 self.fields['team01'].queryset = Team.objects.filter(company=target_company) except Company.DoesNotExist: # 若公司不存在,清空下拉选项避免报错 self.fields['team01'].queryset = Team.objects.none()
可选:增加权限验证(防止越权)
如果需要确保管理员只能修改所属公司的用户,可以在UpdateProfileView中重写get_object方法,验证当前要修改的用户所属公司与URL中的UUID匹配:
from django.core.exceptions import PermissionDenied class UpdateProfileView(SuccessMessageMixin, UpdateView): # ... 其他已有代码 ... def get_object(self, queryset=None): obj = super().get_object(queryset) # 验证用户所属公司的UUID是否与URL参数一致 if obj.company and obj.company.company_uuid != self.kwargs.get('uuid'): raise PermissionDenied return obj
内容的提问来源于stack exchange,提问作者Oriza
相关产品推荐
相关产品推荐

