如何正确使用mixins

时间:2015-07-27 13:14:18

标签: django

请帮助理解为什么以下内容对我不起作用。 因此,我需要在登录用户的页面上显示信息。 为了不在每个视图中重新键入代码,我决定创建一个mixin。

class MyMixin(object):
  def my_view(self):
    args = {}
    args['username'] = auth.get_user(request).username
    args['first_name'] = auth.get_user(request).first_name
    args['last_name'] = auth.get_user(request).last_name
    return args

class someview (TemplateView, LoginRequiredMixin, MyMixin):
  template_name = 'index.html

但是这并没有在模板中显示任何内容。

{{ first_name }}

1 个答案:

答案 0 :(得分:1)

至少有两种方法可以获得这些"上下文变量"进入你的模板:

  1. 您的TemplateView已包含ContextMixin。因此,您可以简单地覆盖该视图的ContextMixin get_context_data方法,如下所示:

    class someview (TemplateView, LoginRequiredMixin):
        template_name = 'index.html
    
        def get_context_data(self, **kwargs):
            context = super(someview, self).get_context_data(**kwargs)
            context['username'] = self.request.user.username
            context['first_name'] = self.request.user.first_name
            context['last_name'] = self.request.user.last_name
            return context
    
  2. 您实际上正在寻找的是一种更干燥的方法,而不一定是混合方法。在这种情况下,您应该使用自己编写的context_processor

    context_processors.py:

    def extra_context(request):                                                         
        args = {}
        args['username'] = auth.get_user(request).username
        args['first_name'] = auth.get_user(request).first_name
        args['last_name'] = auth.get_user(request).last_name
        return args
    

    settings.py:

    TEMPLATE_CONTEXT_PROCESSORS += (your_app.context_processors.extra_context,)
    

    第二种方法会将这三个上下文变量添加到应用中的每个模板。