如何用Django实现动态侧边栏?

Ned*_*dec 0 python django

我计划创建一个带有更改元素的侧边栏(取决于当前的URL和身份验证状态).

例如:默认侧栏显示登录和标签云.

  • 如果用户已经登录,我想显示用户菜单.
  • 如果当前网址是/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')
Run Code Online (Sandbox Code Playgroud)

之后,我想将sidebar(隐式地,不通过它render_to_response)传递给我想要做的事情的模板:

<div id="sidebar">
    {{ sidebar }}
</div>
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Dom*_*ola 5

你最好在context_processors.py文件中执行此操作
这也意味着在返回视图时必须使用RequestContext

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}
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中:

{% if loginform %}
      <form action="accounts/login/">
      {{form.as_p}}
      <input type="submit" name="Login">
      </form>
{% endif %}

{% if tagcloud %}
       {%for tag in tagcloud %}.....{%for}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,登录表单指向一个固定的视图,
如果你想在每个视图上捕获登录表单的帖子,我不知道该怎么做

编辑:如果您不使用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 %}
Run Code Online (Sandbox Code Playgroud)