django 怎么在通用视图中获取User对象数据?

class BaseMixin(object):
    def get(self,request,*args,**kwargs):
        context = super(BaseMixin,self).get(request,*args,**kwargs)
        try:
            if request.user.is_authenticated():
                context['article_count'] =  Article.objects.filter(user_id=request.user.id).count()
        except Exception as e:
            logger.error(''.join(e))

        return context

class BaseMixinTest(object):
    def get_context_data(self,*args,**kwargs):
        context = super(BaseMixinTest,self).get_context_data(*args,**kwargs)
        try:
            if request.user.is_authenticated():
                context['article_count'] =  Article.objects.filter(user_id=request.user.id).count()
        except Exception as e:
            logger.error(''.join(e))

        return context

我是想,如果用户登录,在导航中显示用户发布的内容条数
我自己写的这两个视图都是不成功,第一个视图没有数据,第二个视图BaseMixinTest提示request错误

阅读 6.5k
2 个回答

Mixin 这个概念的出现是为了进行功能复用,但是它本身并不能直接作为视图,只是为功能的实现提供一个抽象的逻辑

打个比方:你不会做番茄炒蛋,但网上有现成的动画教程。那教程里的人操纵的不是真正的番茄和蛋,但是却提供了一个完整的流程。你要实际操作时,只要把真正的番茄和蛋套上去即可。

通常,Mixin要配合Class Based View使用,以类继承的方式聚合功能。一个可能的视图:

class CreateUserMixin(object):
    
    def create_user(self, request, *args, **kwargs):
        # Do something
        
class UserView(View, CreateUserMixin):
    
    def post(self, *args, **kwargs):
        return self.create_user(*args, **kwargs) # 起中间代理的作用,将真正的参数套到现成的逻辑上

至于你的第二个问题,通常来说 request会包含在argskwargs中,需要显式解包:

def func(self, request, *args, **kwargs):
    ...

你的类视图继承自 object ,当然没有request。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题