我计划创建一个包含更改元素的侧边栏(取决于当前网址和身份验证状态)。
例如:默认侧栏显示登录和标签云。
/tagcloud
,我想将其隐藏在边栏中。实际上,我需要一种能让我在视图中做这样的事情的方法:
def some_view(request):
if request.user.is_authenticated():
sidebar.remove('login')
sidebar.add('user_menu')
def tag_cloud(request):
sidebar.remove('tag_cloud')
之后,我想传递sidebar
(隐式地,不会将其传递给render_to_response
)到我想要做的事情的模板:
<div id="sidebar">
{{ sidebar }}
</div>
这可能吗?
答案 0 :(得分:5)
最好在context_processors.py文件中执行此操作 这也意味着你必须use a RequestContext when returning your views
def include_tagcloud(request):
if request.path == '/tagcould/':
tagcloud = Tags.objects.filter(active=True) #whatever
return {'tagcloud': tagcloud}
def include_login(request):
if request.user.is_authenticated():
loginform = MyLoginForm(request.POST)
#passing a Django form + POST data in the case of re-submit
return {'loginform' : loginform}
然后在你的模板中:
{% if loginform %}
<form action="accounts/login/">
{{form.as_p}}
<input type="submit" name="Login">
</form>
{% endif %}
{% if tagcloud %}
{%for tag in tagcloud %}.....{%for}
{% endif %}
在此示例中,登录表单指向固定视图,
如果你想在每个视图上捕获登录表单帖子,我不知道该怎么做
编辑:如果您不使用Django的CSRF功能,您只需在基本模板中插入登录表单,而无需使用任何django表单并指向登录视图:
{% if user.is_authenticated %}
<form action="accounts/login/">
<input type="text" name="username"><input type="password" name="password">
<input type="submit" name="Login">
</form>
{% endif %}
答案 1 :(得分:0)
是的,但你可以使用模板的继承和组合。然后将侧边栏包含在所有模板中使用/继承的父模板中。然后很容易找到侧边栏的模板:它在一个单独的文件中。
答案 2 :(得分:0)
对@Dominique的回答是正确的,但是当您在context_processors
中写东西时,该内容会加载到网站的任何页面上。这可能会带来性能问题。
我认为处理动态边栏的正确方法是simpletag
并在需要的地方使用。
def get_sidebar():
tags = Tags.objects.filter(active=True)
latest_posts = Post.objects.all().order_by('-create_at')[:10]
html = render_to_string("sidebar.html", {
"tags": tags,
"latest_posts": latest_posts
})
return html
现在只需在模板文件中使用
:<div class="col-md-4 sidebar">
{% get_sidebar %}
</div>
此外,您可以将request
传递给simpletag
,以将user.is_authenticated
用于经过身份验证的用户访问。