Django通用UpdateView中,如何实现model的动态切换?
动态切换Django UpdateView中的Model当然可以实现!
完全可以参照你动态切换表单类的思路来做——只需要重写get_model()方法就行,和get_form_class()的逻辑简直是对称操作。
直接上代码示例,改造你的SomeUpdateView:
class SomeUpdateView(generic.UpdateView): login_required = True template_name = '...' # 这里不再硬编码model,留空让get_model()动态返回 form_class = SomeForm success_url = reverse_lazy('some_url') def get_model(self): # 这里根据你的业务规则动态返回对应的Model # 举几个常见的判断场景: # 1. 根据URL中的参数判断 if self.kwargs.get('target_model') == 'special': return SpecialModel # 2. 根据当前登录用户的属性判断 elif self.request.user.is_staff: return StaffOnlyModel # 默认返回的Model else: return DefaultModel
如果你的场景需要更精细地控制查询范围(比如只返回当前用户有权限的对象),还可以结合重写get_queryset()方法,比如:
def get_queryset(self): # 先拿到动态的Model model = self.get_model() # 再返回对应的查询集,比如过滤当前用户的数据 return model.objects.filter(owner=self.request.user)
另外,如果你的表单类也需要和动态Model对应,还可以把get_form_class()和get_model()结合起来用:
def get_form_class(self): model = self.get_model() if model == SpecialModel: return SpecialModelForm elif model == StaffOnlyModel: return StaffOnlyForm else: return DefaultForm
原理小补充
Django的UpdateView继承自SingleObjectMixin,这个混入类里默认的get_model()方法就是返回self.model。所以我们重写这个方法,就能在运行时动态替换要使用的Model,和你之前用get_form_class()切换表单的逻辑完全一致。
内容的提问来源于stack exchange,提问作者Mike Vlad
相关产品推荐
相关产品推荐

