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

时间:2011-01-14 15:37:53

标签: python django

我计划创建一个包含更改元素的侧边栏(取决于当前网址和身份验证状态)。

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

  • 如果用户已登录,我想显示用户菜单。
  • 如果当前网址为/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>

这可能吗?

3 个答案:

答案 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用于经过身份验证的用户访问。