1

我已经阅读了 django 管理视图的源代码,该视图不接受关键字参数。

现在的问题是,除了扩展 django 的默认视图之外,我如何将自己的变量传递给 django 的管理视图?

我不想更改默认视图及其 url 设置,我可以通过其他方式扩展它吗?

我编写自己的 django 中间件将我的公共变量传递给我的所有视图。

但是,在它之后,当我使用 djano 管理视图时,我遇到了 django 得到了意想不到的关键字参数。

我找不到有关此问题的任何帮助,也找不到 django 文档中的示例。

以下链接是我发现的。

Django 视图有一个意外的关键字参数

“得到了一个意外的关键字参数‘ticket_id’”

我将在下面列出我的代码:

中间件.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)

博客视图.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

注意:此视图运行良好。但 django 的管理视图不起作用。

错误信息:

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'

谢谢你的帮助。

4

1 回答 1

0

来自 django 文档:

在 Django 调用视图之前调用 process_view()。

它应该返回 None 或 HttpResponse 对象。如果它返回 None,Django 将继续处理这个请求,执行任何其他 process_view() 中间件,然后是适当的视图。如果它返回一个 HttpResponse 对象,Django 不会费心调用任何其他视图或异常中间件,或适当的视图;它将响应中间件应用于该 HttpResponse,并返回结果。

您不应自己调用 view_func,而应将这些属性附加到请求对象中并返回 None。让 Django 处理视图功能。返回视图调用的响应对象还可以防止其他中间件处理请求,并且以后可能会引发其他错误。

例如

def process_view(self, request, view_func, view_args, view_kwargs):
    request.extra_attrs = {}
    request.extra_attrs['posts_getter'] = PostsGetter()
    request.extra_attrs['user_info'] = UserInfo(request)
    request.extra_attrs['basic_info'] = BasicInfo(request)
    request.extra_attrs['header_menu'] = HeaderMenu()
    request.extra_attrs['comments_getter'] = CommentsGetter()
    request.extra_attrs['tags_getter'] = TagsGetter()
    request.extra_attrs['ttype_getter'] = TTypeGetter()
    request.extra_attrs['link_getter'] = LinkGetter()

官方的 django 中间件文档缺少真实的代码示例。

以下文章提供了一些示例。

有效的 Django 理解中间件

Django Book:第 17 章:中间件

于 2013-11-15T05:52:19.757 回答