Django中如何根据登录用户属性动态切换CreateView对应的model
问题原因
你使用get_object方法不生效的核心原因是:get_object是Django通用视图中用于获取已有数据库实例的方法,仅会在UpdateView、DetailView、DeleteView这类需要操作现有数据的视图中被调用,CreateView的全程执行流程不会触发该方法,因此写在这里的逻辑永远不会执行。
解决方案
你可以选择以下任意一种方案实现动态绑定model:
方案1:复用现有逻辑,在get_form_class中同步赋值model
你已经在get_form_class中完成了用户属性判断,直接在这里补充model赋值即可,无需额外编写重复逻辑:
def get_form_class(self): current_user = self.request.user if current_user.especialidad == 'Reumatología': self.form_class = CasoReumaForm self.model = CasoReuma else: self.form_class = CasoDermaForm self.model = CasoDerma return self.form_class
方案2:单独抽离model逻辑,重写dispatch方法
如果你需要把model绑定逻辑和表单逻辑解耦,可以重写视图的dispatch方法,dispatch是请求进入视图后第一个执行的方法,会在所有业务逻辑处理前运行,在这里赋值model可以保证后续所有流程都能读取到正确的model:
def dispatch(self, request, *args, **kwargs): current_user = request.user if current_user.especialidad == 'Reumatología': self.model = CasoReuma else: self.model = CasoDerma return super().dispatch(request, *args, **kwargs)
如果想要更规范的封装,也可以单独抽离获取model的方法:
def get_model(self): current_user = self.request.user return CasoReuma if current_user.especialidad == 'Reumatología' else CasoDerma def dispatch(self, request, *args, **kwargs): self.model = self.get_model() return super().dispatch(request, *args, **kwargs)
注意事项
- 请确保你的
CasoReumaForm和CasoDermaForm两个ModelForm已经分别正确绑定了对应的CasoReuma和CasoDerma模型 - 你当前
form_valid中注释的图片关联存储逻辑目前是写死的Derma对应的图片模型,后续如果要启用这部分逻辑,需要根据当前绑定的model动态切换对应的图片模型,避免关联存储出错
内容的提问来源于stack exchange,提问作者Carlos Salvador
相关产品推荐
相关产品推荐

