代码之家  ›  专栏  ›  技术社区  ›  5xum

链接“if”和“url”模板标记

  •  1
  • 5xum  · 技术社区  · 11 年前

    我有一个django页面,它在导航栏中包含一个登录表单(用于从主页快速登录)和一个单独的登录页面(如果用户键入错误,将重定向到该页面)。

    我的模板结构是这样的,我有一个 base.html 模板和 navbar.html 样板我的所有页面都扩展了 基本.html 模板(毕竟,这就是它的用途,对吗?),大多数(但不是所有)页面都包含 导航栏.html 模板内部。我在下面粘贴的代码来自 navbar 样板

    我知道这可以做得更优雅,但我的问题更一般,这只是一个用例。我想做的是,在导航栏中,如果当前显示的站点不是登录站点,则只显示登录表单。目前,我已经

    {% if not 'accounts/login' in request.get_full_path %}
    <form class="navbar-form navbar-right" action="{% url 'auth_login' %}" method="POST">
        {% csrf_token %}
        <div class="form-group">
            <input class="form-control" name="username" type="text" placeholder="Username">
        </div>
        <div class="form-group">
            <input class="form-control" name="password" type="password" placeholder="Password">
        </div>
        <button class="btn btn-default" type="submit">Log in</button>
    </form>
    {% endif %}
    

    这很好。然而,我不喜欢 'accounts/login' 是硬编码的。通常,我被教导使用 {% url 'auth_login %} 获得 '帐户/登录' 字符串,因为即使我更改URLConf,字符串仍然正确。然而,我不能简单地写

    {% if url 'auth_login' in request.get_full_path %}
    

    我认为最好的方法是将上下文变量设置为 {% url 'auth_login' %} ,但如何才能做到尽可能干净?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Sayse    11 年前

    在基本表单中,您只需向导航中添加一个块,该块允许页面具有额外的导航项

     {% block extra_nav %}{% endblock %}
    

    然后在登录页面中,您可以包括登录表单

     {% block extra_nav %}{% include 'login_form' %}{% endblock %}    
    

    尽管这会很快变得一团糟。

    或者,您可以包含一个额外的数据参数,该参数仅在需要显示它的页面中传递

     { 'show_login': True }
    
    
    {% if show_login %}
         ... your form
    {% endif %}
    

    由于如果不存在,这将等同于错误,因此不会在未包含的区域显示