python - 链接 `if` 和 `url` 模板标签

标签 python django django-templates templatetags

我有一个 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' %} 的值,但是如何尽可能干净地完成此操作?

最佳答案

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

 {% block extra_nav %}{% endblock %}

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

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

尽管这很快就会变得困惑。

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

 { 'show_login': True }


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

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

关于python - 链接 `if` 和 `url` 模板标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31605389/

相关文章:

python - Django:如何在模板中使用设置?

Django 请求.META

python - Django float 格式只得到 float 后的数字

python - Flask 工厂模式和 Flask CLI 命令

python - 无故改变列表值的函数

python - 如何将模型从一个应用程序导入 Django 中的另一个应用程序?

python - 使用自定义中间表的 Django ManyToMany 关系查询集

python - Django select_related : How to display related table data in a template

python - 如何在每一行提取列表的特定部分?

python - asyncio + asyncpg + pandas : obtain pandas. df 与异步从数据库选择 - 错误