我正在撰写FormView
,例如会在Person
对象上添加评论。
我想检查当前用户是否为此Person
撰写评论,如果他这样做,我想提出Http404
。
问题:此验证的最佳位置是什么?我不想在get_context_data
和form_valid
中致电验证。 dispatch
方法是否适合这种逻辑?
答案 0 :(得分:2)
请记住,只有在您发布表单时才会调用form_valid
,以便仍然可以呈现GET请求。因此,您可以将其放在get
的{{1}}方法中,这会阻止视图和模板加载初始表单。缺点是,如果他们真的想要,人们在技术上仍然可以POST到该URL。
如你所述,我会把它放在FormView
方法中。它是dispatch
周期的早期阶段,因此您可以避免不必要的处理。
FormView
答案 1 :(得分:1)
我写了这个mixin
class PermissionCheckMixin(object):
def __init__(self, perm=None, obj=None):
self.perm = perm
self.obj = obj
def dispatch(self, request, *args, **kwargs):
if request.user.is_anonymous():
if request.is_ajax():
return JSONResponseForbidden()
else:
return HttpResponseForbidden()
elif request.user.is_authenticated():
if self.perm:
if request.user.has_perm(self.perm, self.obj):
return super(PermissionCheckMixin, self).dispatch(request, *args, **kwargs)
else:
if request.is_ajax():
return JSONResponseForbidden()
else:
return HttpResponseForbidden()
else:
if request.is_ajax():
return JSONResponseForbidden()
else:
return HttpResponseForbidden()
并像这样使用它:
class TestFormView(PermissionCheckMixin, FormView):
...
你可以很容易地调整这个混音,就像这样:
def __init__(self, pk):
self.person_pk = pk
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated():
if request.user.pk == self.person_pk:
return HttpResponseNotFound()