Django使变量广泛可用的选项

时间:2009-09-13 10:26:29

标签: django decorator

每次打开页面时,我都希望获得当前活动的项目ID。这将通过查找子域并验证当前登录的用户可以查看它来完成。

一旦我达到我的观点,我希望能够做到

tasks = Task.objects.filter(project = current_project)

WHere current_project(或CURRENT_PROJECT或 current_project ???)已经设置完毕。

任何人都可以解释我在文档中找到的各种方法的利弊,并让我走上正轨吗?

  1. 会话
  2. 中间件
  3. 线程
  4. 建宏
  5. 这就是我最终做到的方式:

    装饰:

    def check4project(fn):
    
        current_project = 'fred'
        def check(*args, **kw):
            kw['project']=current_project
            return fn(*args, **kw)
        return check
    

    查看示例

    @login_required
    @check4project
    @tweetpost
    def index(request, project=0):
    
        print project
    

3 个答案:

答案 0 :(得分:4)

这一切都取决于你对“当前项目”的语义是什么。以下是一些可能性:

  1. 这可能是用户的一个特征:他访问他的个人资料页面并设置当前项目。这将存储在数据库中,您可以使用ORM访问它。

  2. 它可能是URL的一个特征,仅基于子域。这可以通过中间件来完成,中间件可以访问请求,例如,可以解析主机名,并在您可以在视图函数中访问的请求上设置自定义属性。

  3. 与#2类似,如果为某些视图检查项目但不是全部视图,则可以使用视图装饰器。这类似于Django用于检查授权的装饰器。

  4. 这可能是用户访问该网站的一个特征:他访问了一个项目页面,选择了一个项目,并且在他选择另一个项目之前它是粘性的。这最好存储在会话中,该会话专门用于此类瞬态存储。

  5. 根据你的描述,#2或#3最适合你,这取决于你的观点如何在关心子项目之间划分。

答案 1 :(得分:1)

您可以创建一个context_processor,然后从请求对象中获取您的值。

答案 2 :(得分:0)

您考虑过custom template tag吗?