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

2024-05-15 08:11:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如:默认侧边栏显示登录名和标记云。在

  • 如果用户已经登录,我想显示一个用户菜单。在
  • 如果当前的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')

之后,我想将sidebar(隐式地,不传递给render_to_response)传递到模板,在那里我可以执行如下操作:

^{pr2}$

这可能吗?在


Tags: 用户标记身份验证cloudurl元素request状态
3条回答

你最好在一定的背景下这样做_处理器.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}

然后在模板中:

^{pr2}$

在本例中,登录窗体指向一个固定视图,
如果你想在everyview上看到登录表单,我不知道该怎么做

编辑:如果不使用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 %}

@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

现在只需在模板文件中使用:

^{pr2}$

另外,您可以将request传递给simpletag,以使用user.is_authenticated进行经过身份验证的用户访问。在

是的,但是你可以使用模板继承和合成。然后在所有模板中使用/继承的父模板中包含侧栏。然后很容易找到侧边栏的模板:它在一个单独的文件中。在

相关问题 更多 >