gpt4 book ai didi

django - 为所有 View 提供额外的上下文

转载 作者:行者123 更新时间:2023-12-04 00:38:12 25 4
gpt4 key购买 nike

我正在使用 django 为我的团队建立一个项目管理网站。我的基本模板包括一个侧边栏菜单,其中包含所有项目和用户的列表,链接到 DetailView分别针对该用户或项目。

我的问题是我需要提供 UserProject模型到每个 View ,以便我可以渲染该侧边栏。我知道如何 add extra context ;问题是我觉得我通过修改每个级别的上下文来违反 DRY。是否可以简单地重新定义基础 TemplateClass这样所有子类— ListView , DetailView等——包含修改后的上下文?

在相关说明中,如果这是设置项目的糟糕方式,也请告诉我。

最佳答案

您可以使用 template context processor :myapp/context_processors.py :

from django.contrib.auth.models import User
from myapp.models import Project

def users_and_projects(request):
return {'all_users': User.objects.all(),
'all_projects': Project.objects.all()}
然后将此处理器添加到 TEMPLATE_CONTEXT_PROCESSORS Django 版本 < 1.8 的设置:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'myapp.context_processors.users_and_projects',
)
对于 Django 版本 >= 1.8 将其添加到 context_processorsOPTIONS 中列出的 TEMPLATES环境:
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processors.users_and_projects',
],
},
},
]
上下文处理器将为您的所有请求运行。如果您只想为使用 base.html 的 View 运行这些查询那么另一个可能的解决方案是 custom assignment tag :
@register.assignment_tag
def get_all_users():
return User.objects.all()

@register.assignment_tag
def get_all_projects():
return Project.objects.all()
在你的 base.html模板:
{% load mytags %}

{% get_all_users as all_users %}
<ul>
{% for u in all_users %}
<li><a href="{{ u.get_absolute_url }}">{{ u }}</a></li>
{% endfor %}
</ul>

{% get_all_projects as all_projects %}
<ul>
{% for p in all_projects %}
<li><a href="{{ p.get_absolute_url }}">{{ p }}</a></li>
{% endfor %}
</ul>

关于django - 为所有 View 提供额外的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28533854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com