【问题标题】:How to get a layout-less version of a page?如何获得页面的无布局版本?
【发布时间】:2010-08-19 21:24:20
【问题描述】:

我有一些页面,例如用户协议,我希望在有或没有布局(extends 标记)的情况下显示,具体取决于它的调用方式。我正在使用jQuery Fancybox 在 iframe 中加载这些页面。如果 JS 被禁用,链接应该在带有完整布局的新窗口中打开,否则,如果它们在 iframe 中,则不需要布局。

到目前为止,我正在使用 jQuery 去除页眉/页脚(仅用内容部分替换正文)

if(window.location != window.parent.location) {
    $('body').html($('#content'));
}

但是加载永远不会显示的内容(或者更糟的是,将显示半秒直到 JS 启动)似乎并不正确。我想我能做的是创建一个仅包含内容的部分模板,然后创建两个容器页面,一个带有页眉/页脚,一个没有;它们都包括部分。然后使用 JS 修改链接......这将不得不指向不同的视图,这又会调用不同的模板......似乎是一个非常多的工作。一定有更好的方法吗?


@蔡司:

这样的事情在 Django 中是不可能的:

{% if not iframe %}
    {% extends "layouts/default.html" %}
{% endif %}

{% extends %} 标签必须是模板中的第一个标签,因此不能有条件地注释掉。我想也许我可以在布局本身中做到这一点......然后它会应用于我的所有页面......让我们试试吧。

【问题讨论】:

  • (我不知道 django)保留一个视图,但将页眉/页脚移到外面并在包含内容周围创建一个if,您可以在其中检查查询参数。您不需要创建多个视图/寺庙。

标签: javascript jquery django fancybox


【解决方案1】:

使用 Bryan 和 Mark 的答案作为基础,您可以编写自己的上下文处理器: http://docs.djangoproject.com/en/1.2/ref/templates/api/#writing-your-own-context-processors

这样做可以让您在模板中使用 if 语句有条件地提供服务。

可能是最优雅的,因为您仍然可以根据需要使用包装器。

您可以将其与您自己的模板标签结合使用,它为您提供扩展功能,但基于提供的变量是有条件的。 (不确定是否可以复制扩展功能)。

http://docs.djangoproject.com/en/1.2/howto/custom-template-tags/#writing-custom-template-tags

另一种选择是使用 django 的 {% include %} 标记,您可以使用 if 语句包装它。

【讨论】:

  • 我已经尝试复制扩展功能,因为我遇到了另一个问题。这并不容易。不过,使用上下文处理器也可以很好地工作。
  • 是的,我并不感到惊讶。扩展将是一个相当独特的。但是,仅查看扩展代码,似乎扩展需要一个变量。因此,您可以有条件地更改该变量并从最小模板或功能齐全的模板扩展?
  • 我什至不确定有条件地扩展会解决这个问题......实际上,我敢肯定它不会。好吧,除非我有条件地选择了一个 不同的 模板来扩展。但实际上我确实想要布局中的所有<head> 内容,而不是页眉和页脚。我在这里提示了一些关于扩展扩展节点的讨论:stackoverflow.com/questions/3209715/… 如果有兴趣
【解决方案2】:

您始终可以传递 GET 参数并加载不同的模板或更改模板本身。

对于一些 URL,例如 example.com/some/view/?show_simple=yes:

show_simple = request.GET.get('show_simple', False)

if show_simple:
    # return minimal template
# return regular template

【讨论】:

  • 如果show_simple 实际上没有给出值,我不确定request.GET.get('show_simple', False) 返回什么......但它应该是真的。因此,我认为'show_simple' in request.GET 会更好。您已接近解决方案,但您的答案仍然需要两个不同的模板...最好将 show_simple 传递给模板并在那里执行逻辑。
【解决方案3】:

修改您的布局以有条件地包含页眉页脚...

    {% if not iframe %}
    <div id="header">
         ...
    </div>
    {% endif %}

然后将{'iframe':'iframe' in request.GET} 传递到您的模板中。瞧!没有我想象的那么糟糕。

【讨论】:

    猜你喜欢
    • 2017-02-04
    • 2020-10-21
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2015-11-30
    • 2011-03-27
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多