2014-04-22 5 views
9

좋아요 나는 사용자 클래스에 no_m이라는 메서드가 있습니다. 이전에는 데코레이터를 작성하지 않았지만 기본적으로 사용자가 전달하면 사용자를 다른 URL로 리디렉션해야합니다. 나는 디렉토리라고하는 디렉토리에 decorators.py라는 파일을 만들었지 만 데코레이터가 올바르게 임포트되었다고 생각합니다. 그러나 제대로 작동하지 않습니다. Heres는 내가 무엇을 :Django 사용자 정의보기 데코레이터

def no_m(view_func): 
    def _wrapped_view_func(request, *args, **kwargs): 
     try:   
      if request.user.is_m():  
       # quick test 
       return HttpResponseRedirect('http://google.com')    
      else: 
       return view_func(request, *args, **kwargs)  
     except:  
      return _wrapped_view_func 

이 할 필요가 모든 그들이 그 테스트를 통과하면 사용자를 리디렉션, 나는 URL이 그냥 지금은 구글, 그래서 아직 할 필요가 모르겠어요. 어떤 아이디어? 제가 말했듯이, 저는 전에 장식자를 작성하지 않았습니다. 그래서 그것은 제게 새로운 것입니다. 고맙습니다.

또 다른 생각 : 템플릿 페이지를 렌더링 할 수 있습니까?

답변

13

데코레이터에 단계가 없거나 단계가 혼란 스럽습니다. 외부 함수는 내부 함수 (_wrapped_view_func)를 반환해야하며, 은 항상이어야합니다. 즉, 원래 함수가 호출 될 때의 위치를 ​​대신합니다.

예외 조항이 무엇인지 확실하지 않습니다. 그 외에는 항상 블랭크를 사용하는 것이 좋지 않습니다. 즉, 을 모두 잡습니다. ctrl-c와 같은 것을 포함하여 - 장고 함수의 예외는 일반적으로 데코레이터가 아닌 미들웨어에 의해 처리됩니다. 나는 그것을 그냥 제거합니다.

그래서 코드가 있어야한다 : 큰 일

def no_m(view_func): 
    def _wrapped_view_func(request, *args, **kwargs): 
     if request.user.is_m():  
      # quick test 
      return HttpResponseRedirect('http://google.com')    
     else: 
      return view_func(request, *args, **kwargs)  
    return _wrapped_view_func 
+0

감사합니다, 나는 내가 몇 가지 예보고 후 약간 혼란스러워했다 생각합니다. 나는 또한 return render (...)를 시도했지만 아무 것도하지 않았다. 리디렉션 대신 템플릿을 렌더링 할 수있는 방법이 있습니까? – Callum

+0

내 잘못, 오타가 파일 이름에 :( – Callum

관련 문제