如何将Django表单外键选项限定为用户所属关联商家的服务选项
Django表单过滤关联字段选项解决方案
1 前置修正:模型拼写问题
你代码中ServiceRequest模型的service外键声明关联Service,但实际服务模型命名为Services,请先统一命名避免报错,建议将服务模型名改为Service,或调整外键关联为Services。
2 重写ModelForm,动态过滤服务选项
修改ServiceRequestForm,新增接收商家参数的初始化逻辑,过滤service字段的可选范围:
class ServiceRequestForm(forms.ModelForm): class Meta: model = ServiceRequest # 如需隐藏business字段,可直接移除,后续在视图中自动赋值 fields = ['service', 'requester_name'] def __init__(self, *args, **kwargs): # 取出传入的当前用户所属商家参数 business = kwargs.pop('business', None) super().__init__(*args, **kwargs) if business: # 仅展示当前商家下启用的服务 self.fields['service'].queryset = Services.objects.filter(business=business, active=True)
3 修正视图逻辑
原视图存在两处错误:一是通过user.business直接取商家的方式不符合关联表逻辑,二是错误传入了Business类型的instance参数。修改后代码如下:
def newServiceRequest(request): # 获取当前登录用户绑定的商家 user_business = BusinessUser.objects.get(user=request.user).business if request.method == 'POST': form = ServiceRequestForm(request.POST, business=user_business) if form.is_valid(): # 保存前自动赋值商家字段 service_req = form.save(commit=False) service_req.business = user_business service_req.save() # 保存成功后可自定义跳转逻辑 return redirect('你的成功页路由名') else: # 实例化表单时传入商家参数 form = ServiceRequestForm(business=user_business) return render(request,'service.html', {'form': form})
可选优化项
- 可给
BusinessUser模型添加唯一约束,确保每个用户仅绑定一个商家:class BusinessUser(models.Model): # 原有字段不变 class Meta: constraints = [ models.UniqueConstraint(fields=['user'], name='unique_user_business') ] - 若存在用户未绑定商家的场景,可添加
try-except捕获BusinessUser.DoesNotExist异常,做对应跳转提示。
内容的提问来源于stack exchange,提问作者user1438274
相关产品推荐
相关产品推荐

