4

我在 django auth 旁边使用 django-registration 来创建和登录我的客户帐户。

我们的网站将由移动用户和桌面用户使用。我们刚刚开始通过根据用户代理字符串从视图加载不同的模板来解决移动用户的想法。它做得很干净,但我不确定这是否是正确的方法,因为我们现在被困在不容易访问的视图上做什么(我们不是自己写的)。

这给我带来了手头的问题:我不知道如何解决将移动用户重定向到 django-registration/auth 发送到的登录 url(桌面版)的问题。

我可以改变策略并处理模板文件本身中的不同浏览器。感觉它会很快变得混乱。我一点也不喜欢这个主意!

或者我仍然使用我当前的方法,即根据用户代理字符串使用不同的模板呈现请求。然后我需要知道我应该如何处理 django-registration(如何根据用户代理字符串加载一组不同的模板)。如果只是为了使更新模块更容易,我宁愿不更改 django-registration 代码。

4

2 回答 2

2

django 注册模板非常简单,很少使用。我只是将这些作为特殊情况处理,然后提出一个 base.html,它可以在两个平台上运行得相当好。

我的注册页面看起来很简单,很多网站都是这样做的,这并不意外。

另一个选择是我们的中间件,它根据检测是否是移动设备来设置模板目录。您可以像这样在 python 视图中检测移动浏览器(不仅仅是 iPhone),然后使用 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 设置每个线程变量而不是全局变量,因此每个请求响应循环都会获得它自己的变量“版本”。

于 2011-08-07T19:04:51.637 回答
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)
于 2011-08-07T21:30:53.217 回答