2014-11-08 2 views
0

FormView을 쓰고 있는데, 예를 들어 Person 개체에 대한 설명이 추가됩니다.양식이 아닌 필드의 FormView 유효성 확인

현재 사용자가 Person에 대한 의견을 작성했는지 확인하고 싶다면 Http404을 올리고 싶습니다.

질문 :이 유효성 검사를위한 가장 좋은 장소는 무엇입니까? 유효성 검사를 get_context_dataform_valid에 호출하고 싶지 않습니다. dispatch 방법이이 논리에 적합한 곳입니까?

답변

2

form_valid은 양식을 POST 할 때만 호출되므로 GET 요청이 계속 렌더링되므로 작동하지 않습니다. 따라서 getFormView 메서드에 넣을 수 있습니다. 그러면 뷰와 템플릿에 초기 폼이로드되지 않습니다. 단점은 사람들이 기술적으로 여전히 그 URL에 POST 할 수 있다는 것입니다.

앞서 말씀 드린대로 dispatch 메서드에 넣습니다. FormView의주기 초기이므로 불필요한 처리를 피할 수 있습니다. 당신은 쉽게 다음과 같이 어떻게 든이 믹스 인을 적용 할 수

class TestFormView(PermissionCheckMixin, FormView): 
    ... 

:

def dispatch(self, request, *args, **kwargs): 
    # I'm just guessing your Comment/Person models 
    user = self.request.user 
    try: 
     person = Person.objects.get(user=self.request.user) 
    except: 
     raise Http404("No user exists") 
    if Comment.objects.filter(content_object=person).exist(): 
     raise Http404("Comment already exists") 
    return super(MyFormView, self).dispatch(request, *args, **kwargs) 

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

1

나는이 믹스 인이 같은

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

그리고 그것을 사용을 썼다 :

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() 
관련 문제