如何在通用视图中重定向

时间:2019-08-30 09:25:41

标签: django django-views

我正在使用通用视图来呈现我的博客文章:

class PostUpdateView(UpdateView, LoginRequiredMixin):
    model = Post
    # etc

我在Post模型上有一个模型方法,结果为布尔值TrueFalse

@property
def can_edit(self):
    return self.displays_set.count() == 0 

如果can_edit对象的FalsePost,如何重构视图以从我的UpdateView重定向到另一个DetailView

2 个答案:

答案 0 :(得分:3)

重写dispatch方法,然后在此处检查obj.can_edit。这样,将针对getpost请求检查对象。

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方法是最好的解决方法,
但是如果要避免额外的数据库命中,则需要重写getpost方法

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)