Django如何扩展通用视图类

Django如何扩展通用视图类,django,django-views,Django,Django Views,我注意到我正在为我的站点上的许多视图设置站点范围的上下文变量和请求变量。当然,这种情况需要继承。如果我所有基于视图类的视图都是从SiteView继承的,而不是从泛型视图继承的,那么我可以将所有的共性都分解到SiteView子类中。然后,我可以从SiteView继承所有视图。但是,我不能让它工作。这是我的密码: from django.contrib.auth.decorators import login_required from django.views.generic import Vie

我注意到我正在为我的站点上的许多视图设置站点范围的上下文变量和请求变量。当然,这种情况需要继承。如果我所有基于视图类的视图都是从SiteView继承的,而不是从泛型视图继承的,那么我可以将所有的共性都分解到SiteView子类中。然后,我可以从SiteView继承所有视图。但是,我不能让它工作。这是我的密码:

from django.contrib.auth.decorators import login_required
from django.views.generic import View
from django.utils.decorators import method_decorator

class SiteView(View):
    ''' Extends the generic django-supplied View class '''

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
         return super(SiteView, self).dispatch(*args, **kwargs)

    def get(self, *args, **kwargs):
        ''' Adds the variables required in the get request '''
        context = super(SiteView, self).get(*args, **kwargs)

        context['common_var'] = 'some common value'
        context['user'] = request.user

        return self.render_to_response(context)
这会引发以下TypeError:

    dispatch() missing 1 required positional argument: 'request'
任何帮助都将不胜感激

编辑:即使正确答案被标记,代码也存在其他问题。特别是,SiteView的get方法不应包含以下行:

context = super(SiteView, self).get(*args, **kwargs)

这是因为View类没有任何get方法。

您忘记将请求传递给
super()。dispatch(…)
调用:

class SiteView(View):

    @method_decorator(login_required)
    def dispatch(self, request, *args, **kwargs):
         return super(SiteView, self).dispatch(request, *args, **kwargs)
不过,传递函数名可能更为优雅,如:

@method_decorator(login_required, name='dispatch')
class SiteView(View):

    # ...
实现一个“mixin”(可能带有的子类)可能更有意义

例如:

class SiteViewMixin(LoginRequiredMixin):

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context.update(common_var='some common value', user=self.request.user)
        return context
然后在另一个视图中使用mixin,如:

class SomeView(SiteViewMixin, TemplateView):
    # ...
class SomeView(SiteViewMixin,TemplateView):

#…
我得到消息“'super'对象没有'get'属性”当我添加Request时,我将您的答案标记为正确答案,因为它确实解决了我的错误。但是,正如我之前的评论所示,代码的其他部分也需要进行一些调整。特别是,在查看Django的View类实现后,我发现context=super(SiteView,self)。getget方法中的(*args,**kwargs)也导致了一个错误,因为View类没有get函数,因此错误:“super的对象没有属性‘get’。@EarlyCoder:ah,这确实是正确的:a
视图没有
get(…)
post(…)
,等等:
调度(…)
将查看此方法是否可用并相应重定向。因此,您应该删除
超级(..).get(..)
调用您的
get(..)
方法。@EarlyCoder:更新了关于
get(..)
的注释。在这里实现混入可能更有意义?
class SiteViewMixin(LoginRequiredMixin):

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context.update(common_var='some common value', user=self.request.user)
        return context
class SomeView(SiteViewMixin, TemplateView):
    # ...