【问题标题】:Django options for making variables widely available使变量广泛可用的 Django 选项
【发布时间】:2010-11-27 21:26:13
【问题描述】:

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

一旦我达到我的视野,我希望能够做到

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

这里的 current_project(或 CURRENT_PROJECT 或 current_project ???)已经设置好了。

谁能解释我在文档中找到的各种方法的优缺点并让我走上正轨?

  1. 会话
  2. 中间件
  3. 线程
  4. 内建

我最后是这样做的:

装饰者:

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

【问题讨论】:

    标签: django decorator


    【解决方案1】:

    你考虑过custom template tag吗?

    【讨论】:

    • 大多数情况下,我希望在调用模板之前将其显示在视图中,但感谢您的贡献。
    【解决方案2】:

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

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

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

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

    4. 这可能是用户访问该站点的一个特征:他访问了一个项目页面,选择了一个进行工作,并且在他选择另一个项目之前一直保持粘性。这最好存储在会话中,专门用于这种临时存储。

    根据您的描述,听起来 #2 或 #3 最适合您,这取决于您的观点如何在关心子项目和不关心子项目之间进行划分。

    【讨论】:

    • 感谢您的有用回答,它帮助我阐明了各种选择。我喜欢 3. 的声音,因为它是一种验证用户可以同时访问项目的简单方法,并且大多数但不是所有视图都需要了解项目。
    【解决方案3】:

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

    【讨论】:

    • context_processor 不是解决这个问题的最佳解决方案,但它解决了我遇到的另一个问题!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2011-12-14
    • 2015-12-30
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多