在应用程序之间传递django上下文

时间:2013-05-03 16:48:09

标签: django django-views django-context

所以我对Django很新,我正在创建一些简单的网站。现在我正在尝试创建一个可用于托管我的其他应用程序的网站。目前,主站点通过将名称/ URL字典传递给模板来呈现导航栏。例如,这是主要网站的views.py:

from django.shortcuts import render_to_response

navbar = [{'Home': '/'},
          {'Apps': '/apps/'},
          {'Dropdown': '',
          'Google': 'http://www.google.com',
          'Stackoverflow': 'http://www.stackoverflow.com'}]

context = {'navbar': navbar}


def home(request):
    return render_to_response("website/home.html", context)


def apps(request):
    return render_to_response("website/applist.html", context)

这会导致主视图和应用列表视图都有一个导航栏,其中包含指向website.com/,network.com/apps/的链接,以及一个标题为“Dropdown”的下拉列表,其中包含指向Google的链接和stackoverflow。

我的问题是我创建了另一个具有自己视图的应用程序,这些视图使用自己的上下文值呈现给其他模板。例如,它可能会使用:

def appview(request):
    ## view logic...
    context = {"users": users, "comments": comments}
    render_to_response("app/response.html", context)

如果我愿意的话,我可以打开应用程序,以便用“website / apprender.html”代替“app / response.html”,即:

def appview(request, template):
    ## view logic...
    context = {"users": users, "comments": comments}
    render_to_response(template, context)

但上下文仍然只包含用户和评论,而不是我的导航栏信息。我想我应该为应用程序添加的输入上下文添加另一个参数,即

def appview(request, template, context):
    ## view logic...
    context["users"] = users
    context["comments"] = comments
    render_to_response(template, context)

但我想知道最佳做法是什么。那么 是最佳做法?

1 个答案:

答案 0 :(得分:0)

处理任何事情的最佳做法都值得商榷。创建导航栏时,我建议使用以下方法之一:

  • 将导航栏实施为模板标签。模板标签可以加载到任何模板中,并在整个项目中生成一致的导航栏,或者只包含在base.html中。如果你想挂钩这个导航栏,可以通过允许templatetag标记一个参数来做到这一点,该参数可以是现有菜单结构的附加菜单或增量值的列表。

  • 如果您的导航栏永远不会更改的另一个解决方案是直接在base.html文件中对其进行编码,其他模板将继承该文件。在任何情况下,更改导航栏都需要对项目进行新的提交,并且您可以避免使用复杂的模板逻辑来为其生成html。