我正在使用通用视图来呈现我的博客文章:
class PostUpdateView(UpdateView, LoginRequiredMixin):
model = Post
# etc
我在Post
模型上有一个模型方法,结果为布尔值True
或False
:
@property
def can_edit(self):
return self.displays_set.count() == 0
如果can_edit
对象的False
是Post
,如何重构视图以从我的UpdateView
重定向到另一个DetailView
?
答案 0 :(得分:3)
重写dispatch
方法,然后在此处检查obj.can_edit
。这样,将针对get
和post
请求检查对象。
class PostUpdateView(LoginRequiredMixin, UpdateView):
model = Post
def dispatch(self, *args, **kwargs):
obj = self.get_object()
if not obj.can_edit:
return redirect('/readonly-view/')
return super().dispatch(*args, **kwargs)
使用此解决方案,get_object()
被调用两次,因此存在重复的SQL查询。但是,保持代码简单可能是值得的。
答案 1 :(得分:0)
我想说,重写dispatch
方法是最好的解决方法,
但是如果要避免额外的数据库命中,则需要重写get
和post
方法
def get(self, request, *args, **kwargs):
self.object = self.get_object()
if not obj.can_edit:
return redirect('/readonly-view/')
return self.render_to_response(self.get_context_data())
def post(self, request, *args, **kwargs):
self.object = self.get_object()
if not obj.can_edit:
return redirect('/readonly-view/')
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)