1

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

我的模板结构是这样的,我有一个base.html模板和一个navbar.html模板。我所有的页面都扩展了base.html模板(毕竟,这就是它的用途,对吗?),然后大多数(但不是全部)页面都包含navbar.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 %}获取'accounts/login'字符串是最佳实践,因为即使我更改了 URLConf,这也允许字符串仍然正确。但是,我不能简单地写

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

我想最好的办法是以某种方式将上下文变量设置为 的值{% url 'auth_login' %},但是如何尽可能干净地完成呢?

4

1 回答 1

1

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

 {% block extra_nav %}{% endblock %}

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

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

尽管这会很快变得混乱。

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

 { 'show_login': True }


{% if show_login %}
     ... your form
{% endif %}

由于如果不存在这将等同于 false,因此它不会显示在不包含它的区域中

于 2015-07-24T08:22:08.693 回答