【问题标题】:Keeping Django Views DRY保持 Django 视图 DRY
【发布时间】:2010-11-08 15:25:05
【问题描述】:

我有一些代码可以获取当前登录的用户。

userID = request.session.get("_auth_user_id")
    if userID:
        loggedin_user = User.objects.get(pk=int(userID))
    else:
        loggedin_user = None

我希望用户名显示在每个页面上。

目前我将代码放在每个视图中并将用户对象传递给每个模板

return render_to_response('index.html', {loggedin_user})

这似乎违背了 django 的 D.R.Y 伦理。我怎么能重复自己呢?

编辑:也许用户是一个坏例子。

如果我想从数据库中获取对象列表,该怎么办?

items = Item.objects.all()

并在每一页上列出它们。

我是否必须编写该代码并将列表传递给每个视图中的模板。或者我可以编写一些代码让所有模板都可以使用该列表吗?

【问题讨论】:

    标签: django dry django-views


    【解决方案1】:

    用户 ID 已存在于会话中。因此,您不需要一直传递它。

    {{ request.session._auth_user_id }}
    

    应该可以,但是您需要在设置文件的 TEMPLATE_CONTEXT_PROCESSORS 中添加它:

    django.core.context_processors.request
    

    在您的 render_to_response 中,您需要将请求添加为参数。例如:

     return render_to_response('test.html',{}, context_instance=RequestContext(request))
    

    【讨论】:

    • 对不起,我打错了我想将整个 User 对象传递给模板,而不仅仅是 id
    • 同样,如果您已将用户添加到会话中,则整个用户都已经存在,因此您应该能够访问其任何字段。
    • @Cato: {{ user }} 可用于任何模板,如果您将 django.core.context_processors.auth 放入 settings.TEMPLATE_CONTEXT_PROCESSORS,但匿名用户不是 None,它们是 AnonymousUser 的实例。见docs.djangoproject.com/en/dev/topics/auth/…
    【解决方案2】:

    你应该使用custom template tag 来做类似的事情。您可以在自定义标签中获取您需要的数据,并将其发送到模板。您需要记住的只是将标签加载到您将要使用它的模板文件中。

    【讨论】:

    • 但是你在 20 个模板中有 {% load my _template_tag %} ...这不是 DRY
    • 如果您经常使用它,很可能它位于您正在扩展的父模板中,因此,您只会在一个地方拥有它。如果不是这种情况,您可能可以使用自定义上下文处理器。
    【解决方案3】:

    request.user 呢?

    if request.user.is_authenticated():
        name = request.user.username
    else:
        name = "Anonymous"
    

    无论如何,如果它在 django 中不可用,我建议你编写一个中间件类,就像 django.contrib.sessions.middleware.SessionMiddleware 或 django.contrib.auth.middleware.AuthenticationMiddleware 一样。该类会在将请求详细信息发送到视图之前对其进行更改。

    如果您需要在每个视图的基础上使用它,您可以编写一个装饰器来做这件小事,然后 @decorator 获得您想要的视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多