从基于 class 的视图中访问请求对象?需要确定请求是否来自移动设备

Accessing the request object from within a class based view? Needed to determine if the request is coming from a mobile device

我有以下 CBV:

class Index(TemplateView):
        template_name = 'index_app/index.html'

以及一个可以获取请求对象和 return 无论它是否来自移动设备的函数:

def mobileBrowser(request):

mobile_browser = False
ua = request.META['HTTP_USER_AGENT'].lower()[0:4]

if (ua in mobile_uas):
    mobile_browser = True
else:
    for hint in mobile_ua_hints:
        if request.META['HTTP_USER_AGENT'].find(hint) > 0:
            mobile_browser = True

return mobile_browser

我希望能够使用它在我的 CBV 中执行如下操作:

class Index(TemplateView):
if mobileBrowser(request):
    template_name = 'index_app/mobile/index.html'
else:
    template_name = 'index_app/index.html'

这是不可能的,因为 CBV 似乎无法访问请求对象。在这种情况下有什么方法可以访问这个对象吗?

我知道可以改为创建标准视图,但稍后我想继续使用 CBV,如 CreateView 等等,这只会让我再次陷入同样的​​境地。

您可以使用 self.request 访问请求。此逻辑的最佳位置是 get_template_names

def get_template_names(self):
    if mobileBrowser(self.request):
        template_name = 'index_app/mobile/index.html'
    else:
        template_name = 'index_app/index.html'
    return template_name