字段上的FormView验证不是来自表单

时间:2014-11-08 13:17:35

标签: django django-views

我正在撰写FormView,例如会在Person对象上添加评论。

我想检查当前用户是否为此Person撰写评论,如果他这样做,我想提出Http404

问题:此验证的最佳位置是什么?我不想在get_context_dataform_valid中致电验证。 dispatch方法是否适合这种逻辑?

2 个答案:

答案 0 :(得分:2)

请记住,只有在您发布表单时才会调用form_valid,以便仍然可以呈现GET请求。因此,您可以将其放在get的{​​{1}}方法中,这会阻止视图和模板加载初始表单。缺点是,如果他们真的想要,人们在技术上仍然可以POST到该URL。

如你所述,我会把它放在FormView方法中。它是dispatch周期的早期阶段,因此您可以避免不必要的处理。

FormView

编辑 This is a good link describing the various ways you can decorate your class based view to add permission and user checking

答案 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()