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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:42:38