Django:使用条件 % extends % 使 % block "div" % 有条件

Posted

技术标签:

【中文标题】Django:使用条件 % extends % 使 % block "div" % 有条件【英文标题】:Django: making % block "div" % conditional with a conditional % extends %Django:使用条件 % extends % 使 % block "div" % 有条件 【发布时间】:2013-08-30 14:34:05 【问题描述】:

我想在 AJAX 和常规 HTTP 调用之间共享一个模板,唯一的区别是一个模板需要扩展 base.html html,而另一个不需要。

我可以使用

% extends request.is_ajax|yesno:"app/base_ajax.html,app/base.html" %

动态决定何时扩展,但我还需要包含% block 'some_div' %% endbock % 标签来告诉渲染器将我的内容放在哪里。 ajax 调用需要忽略这些标签,因为 jQuery 告诉它在哪里放置带有 $('somediv').html(response) 的内容。

知道在不是 ajax 调用时如何动态包含这些块标签吗?

我一直在参考这个问题来弄清楚:

Any way to make % extends '...' % conditional? - Django

尝试通过 % if % 使其工作:

% extends request.is_ajax|yesno:",stamped/home.html" %
% if request.is_ajax == False%
% block results %
% endif %
% load stamped_custom_tags %

...
Content
...
% if request.is_ajax == False%
% endblock %
% endif %

但是当解析器遇到 % endif % 时失败

【问题讨论】:

【参考方案1】:

这或其他变体不会吗?

% if request.is_ajax %
    # ajax! #
% else %
    % block 'some_div' %% endbock %
% endif %

【讨论】:

感谢您的回答 Rob,但我必须将模板重复两次。一次在您的 ajax 部分中没有块标记,一次在块标记中。这就像两个具有相同内容的单独模板一样糟糕,这正是我要避免的事情。 不,你不会。制作模板,当你到达块标签所在的部分时,使用条件。如果是 ajax,则不会有任何内容(只是评论),如果不是,则该块将去那里。 你试过了吗?在发布我的问题之前,我试图做这样的事情。我必须将块标签包裹在内容周围,所以我需要两个条件;一个用于块的开始,一个用于结束。问题是解析器在第一个 % block 'some_div' % 之后看到 endif 时会感到困惑。我之前无法通过解析器,这导致我在这里发帖。任何提示将不胜感激。 您能否发布一个简单版本的模板,以便我们了解发生了什么? 是的,那行不通。你不能有条件地中断一个块(如果只有一个是真的呢?)。我不明白你想用它来完成什么。【参考方案2】:

我的解决方案:

% extends x|yesno:"stamped/blank.html,stamped/home.html" %

其中blank.html 包含:

% block results %% endblock %

<!-- to allow for corrected shared rendering 
    with ajax posts and normal django rendering -->

home.html 是我的标准应用页面,其中包含要扩展的结果块。

【讨论】:

以上是关于Django:使用条件 % extends % 使 % block "div" % 有条件的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何使表单有条件?

在 Django 中使迁移有条件

如何使某个模板仅对 Django 中已确认的用户可见?

如何使Django模板包括工作[关闭]

如果我使用 % extends %,Django 会忽略子模板中的内容

使用 Django 模板作为片段