Django 1.10 模板在其父级之外呈现嵌套的 HTML 标签

Posted

技术标签:

【中文标题】Django 1.10 模板在其父级之外呈现嵌套的 HTML 标签【英文标题】:Django 1.10 Template Renders Nested HTML Tags Outside Their Parent 【发布时间】:2018-03-06 21:22:05 【问题描述】:

我对 Django 模板的以下行为感到有些困惑,这使我无法成功地设置输出样式。

也就是说,我有以下模板:

<article class="article
    % if article.is_featured % featured% endif %
    % if not article.published % unpublished% endif %">
% if not detail_view %

    <div class="post-preview">
        <a href="% namespace_url 'article-detail' article.slug namespace=namespace default='' %">
            <h2 class="post-title">
           % render_model article "title" "" "" "striptags" %
            </h2>
           % if article.lead_in %
            <h3 class="post-subtitle">
                % if not detail_view %
                    % render_model article "lead_in" "" "" "truncatewords:'20'|striptags" %
                % else %    
                    % render_model article "lead_in" "" "" "striptags" %
                % endif %
            </h3>
           % endif %
        </a>
        <p class="post-meta" style="margin-bottom: 0;"> Posted by 
            % include "aldryn_newsblog/includes/author.html" with author=article.author %
            on  article.publishing_date|date:"F d, Y" 
        </p> 
        <p class="post-meta" style="margin: 0">
            <h4 style="display:inline-flex">Categories:</h4>
                % for category in article.categories.all %
                    <a href="/articles/category/category.name|lower"> category.name  % if not forloop.last %, % endif %</a>
                % endfor %
        </p>
        <p class="post-meta" style="margin: 0">
            <h4 style="display:inline-flex">Tags:</h4>
                % for tag in article.tag %
                    <a href="/articles/category/tag.name|lower"> tag.name  % if not forloop.last %, % endif %</a>
                % endfor %
        </p>
    </div>
    <hr>
% endif %

% if detail_view %
<!--    <h3>Testing template! (from article with detail_view=True)</h3> -->
        % render_placeholder article.content language placeholder_language %        
% endif %

</article>

这个模板的输出大致是这样的:

<article class="article">
    <div class="post-preview">
        <a href="/articles/third-post/">
            <h2 class="post-title">
           Third Post
            </h2>  
            <h3 class="post-subtitle">
                    Third post lead-in text.
            </h3>
        </a>
        <p class="post-meta" style="margin-bottom: 0;"> Posted by 
    <a href="">      
    </a>

            on September 19, 2017
        </p> 
        <p class="post-meta" style="margin: 0">
            <h4 style="display:inline-flex">Categories:</h4>

             <a href="/articles/category/programming">Programming </a>               
        </p>
    <p class="post-meta" style="margin: 0">
        <h4 style="display:inline-flex">Tags:</h4>

    </p>

    </div>
    <hr>
</article>

虽然源 HTML 看起来是正确的,但浏览器会将其视为下图所示。

我错过了什么?模板不正确吗?或者这是我正在观察的错误?我在 Safari 和 Firefox 中试过这个。结果是一样的。

【问题讨论】:

【参考方案1】:

不,这只是浏览器开发工具试图理解您的无效 HTML。

h 元素不能进入p 元素内。

【讨论】:

【参考方案2】:

看看这个答案:

<h1>, <h2>, <h3>... tags, inline within paragraphs (<p>)

他们在那里更深入地解释它,但基本上你的&lt;h1,2,3,4&gt;标签被嵌入到&lt;p&gt;标签中被浏览器认为是非法的,并且会自动关闭标签。使用不同的标签,它应该可以解决您的问题。

【讨论】:

非常感谢!

以上是关于Django 1.10 模板在其父级之外呈现嵌套的 HTML 标签的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.10 模板语法错误。您是不是忘记注册或加载此标签?

为啥嵌套表在父表之外呈现?

Django 1.10文档中文版Part2

如何区分提交与其父级

如何区分提交与其父级

如何获取 Swing 组件的坐标,而不管其父级如何?