我在django auth旁边使用django-registration来创建和登录我的客户帐户。
我们的网站将由移动用户和桌面用户使用。我们刚开始根据用户代理字符串从视图中加载不同的模板来解决移动用户的想法。它干得很干净,但我不确定这是否是正确的方法,因为我们现在仍然不知道如何处理不容易访问的视图(我们没有自己编写)。
这让我想到了手头的问题: 我不知道如何解决重定向移动用户远离django-registration / auth发送给他们的登录URL(桌面版)。
我可以改变策略并解决模板文件本身的不同浏览器问题。感觉它会变得很快乱。我完全不喜欢这个想法!
或者我继续使用我当前的方法,即使用基于用户代理字符串的不同模板呈现请求。然后我需要知道我应该如何处理django-registration(如何根据用户代理字符串加载一组不同的模板)。如果只是为了让更新模块更容易,我宁愿不改变django注册码。
答案 0 :(得分:2)
django注册模板非常简单,很少使用。我只是将这些作为特殊情况来处理,并且只是想出了一个base.html,它可以很好地在两个平台上运行。
我的注册页面看起来非常简单,许多网站都这样做,这并不意外。
另一个选择是给我们一个中间件,它根据检测模板目录是否是移动设备来设置模板目录。你可以像这样Detect mobile browser (not just iPhone) in python view检测移动浏览器,然后有一个使用make_tls_property技巧的中间件来更新TEMPLATE_DIRS,如下所示:
TEMPLATE_DIRS = settings.__dict__['_wrapped'].__class__.TEMPLATE_DIRS = make_tls_property(settings.TEMPLATE_DIRS)
class MobileMiddleware(object):
"""Sets settings.SITE_ID based on request's domain"""
def process_request(self, request):
if *mobile*:
TEMPLATE_DIRS.value = *mobiletemplates* + settings.BASE_TEMPLATE_DIRS
else:
TEMPLATE_DIRS.value = *normaltemplates* + settings.BASE_TEMPLATE_DIRS
为了清楚起见,make_tls_property是djangotoolbox的一部分,它使TEMPLATE_DIRS设置每个线程变量而不是全局变量,因此每个请求响应循环都获得它自己的变量“版本”。
答案 1 :(得分:2)
一种方法是简单地编写自己的登录视图,调用django-registration视图来完成繁重的工作,但根据上下文将其传递给另一个模板:
def login(request, *args, **kwargs):
my_kwargs = kwargs.copy()
if <mobile condition>:
my_kwargs['template_name'] = 'my_app/some_template.html'
else:
my_kwargs['template_name'] = 'my_app/some_other_template.html'
from django.contrib import auth
return auth.login(request, *args, **my_kwargs)