2013-11-15 2 views
1

django의 관리자보기 소스 코드를 읽었으므로보기에 키워드 인수를 허용하지 않습니다.django가 미들웨어를 추가 한 후 예기치 않은 키워드 인수가 발생했습니다.

이제는 문제가됩니다. 어떻게 장고의 관리자에게 내 자신의 변수를 전달할 수 있습니까? 장고의 기본보기 확장을 제외하고보기?

기본보기와 해당 URL 설정을 변경하고 싶지 않습니다. 다른 방법으로 을 확장 할 수 있습니까?

내 공개 변수를 모두 내보기에 전달하기 위해 내 자신의 장고 미들웨어를 작성합니다.

하지만 djano 관리자보기를 사용할 때 django가 예기치 않은 키워드 인수를 만난다.

이 문제에 대한 도움을 찾을 수 없으며 django의 문서에서 예제를 찾을 수 없습니다.

다음 링크는 내가 찾은 것입니다.

Django view got an unexpected keyword argument

"got an unexpected keyword argument 'ticket_id'"

내가 아래에있는 내 코드가 나열됩니다 :

middleware.py을

from blog.data import (UserInfo,BasicInfo,APost,HeaderMenu,PostSummary,TagsGetter, 
         ArchivesIndex,PostsGetter,CommentsGetter,TTypeGetter,LinkGetter) 

class data_md(object): 
    """pass some kwargs to view to share public data""" 
    def process_view(self, request, view_func, view_args, view_kwargs): 
     #if 'djangoadmin' not in request.path: 
     if True: 
      view_kwargs['posts_getter'] = PostsGetter() 
      view_kwargs['user_info'] = UserInfo(request) 
      view_kwargs['basic_info'] = BasicInfo(request) 
      view_kwargs['header_menu'] = HeaderMenu() 
      view_kwargs['comments_getter'] = CommentsGetter() 
      view_kwargs['tags_getter'] = TagsGetter() 
      view_kwargs['ttype_getter'] = TTypeGetter() 
      view_kwargs['link_getter'] = LinkGetter() 
      return view_func(request, view_args, view_kwargs) 

블로그 views.py

def tags_view(request, args, data): 
    tag = data.get('tagname',None) 
    tags_getter = data.get('tags_getter',None) 
    if tag in tags_getter.tagnamelist: 
     from blog.data import get_summarys_bytag 
     post_summarys = get_summarys_bytag(tag) 
     return render_to_response('blog/read_bytags.html',locals()) 
    else: 
     raise Http404 

참고 :이보기는 정상적으로 작동하지만 장고의 관리자보기가 작동하지 않습니다.

오류 메시지 : 당신의 도움에 대한

Environment: 


Request Method: GET 
Request URL: http://127.0.0.1/djangoadmin/ 

Django Version: 1.5.4 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'django.contrib.admindocs', 
'blog') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.transaction.TransactionMiddleware', 
'blog.middleware.data_md') 


Traceback: 
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    109.       response = middleware_method(request, callback, callback_args, callback_kwargs) 
File "/root/win7/app/django/pycms/blog/middleware.py" in process_view 
    20.    return view_func(request, *view_args, **view_kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/sites.py" in wrapper 
    219.     return self.admin_view(view, cacheable)(*args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/utils/decorators.py" in _wrapped_view 
    91.      response = view_func(request, *args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func 
    89.   response = view_func(request, *args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/contrib/admin/sites.py" in inner 
    202.    return view(request, *args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func 
    89.   response = view_func(request, *args, **kwargs) 

Exception Type: TypeError at /djangoadmin/ 
Exception Value: index() got an unexpected keyword argument 'header_menu' 

감사합니다. 장고 문서에서

답변

0

:

process_view은() 장고 뷰를 호출하기 직전에 호출된다.

None 또는 HttpResponse 개체를 반환해야합니다. None을 반환하면 Django는이 요청을 처리하고 다른 process_view() 미들웨어를 실행 한 다음 적절한보기를 실행합니다. 이 HttpResponse 객체를 반환하면 Django는 다른 뷰 또는 예외 미들웨어를 호출하거나 적절한 뷰를 호출하지 않습니다. 해당 HttpResponse에 응답 미들웨어를 적용하고 결과를 반환합니다.

직접 view_func를 호출하면 안되며 대신 이러한 속성을 요청 객체에 첨부하고 없음을 반환해야합니다. Django가 뷰 기능을 처리하도록합니다. 뷰 호출의 응답 객체를 반환하면 다른 미들웨어가 요청을 처리하지 못하게되어 나중에 d에서 다른 오류가 발생할 수 있습니다.

공식 django 미들웨어 doc에는 실제 코드 예제가 없습니다.

아래 기사는 몇 가지 예를 제공합니다. 이 장고는 우리가 통과하는 동안의 키워드 인수를 변경하는 것을 허용하지 않는 것 같다 well.Now 도와

Effective Django Understanding Middleware

The Django Book: Chapter 17: Middleware

+0

감사합니다 :) 당신의 도움 :)에 대한 –

+0

덕분에,이 방법은 작동 중순 처리기 소스 코드에서 내가 결론을 이끌어 내는데 도움이되는 것을 찾을 수 없다. 오히려 장고 자신의 미들웨어 소스 코드에서 process_view()에 대해 sth를 찾을 수 없다. –

+0

이 경우 process_view() 대신 process_request() 함수를 사용할 수 있지만 process_view의 존재 가치는 무엇입니까? :) –

관련 문제