django 1.6 - 如何将基于类的视图作为{%include%}插入模板

时间:2014-03-19 14:50:36

标签: django django-templates django-views

我当前的模板结构有一个home.html,从base.html延伸。该home.html文件还有自己的{% include %}标记,可以从其他模板(联系表单等)中获取。

我遇到的问题是,当我在基于类的视图上使用{% include %}标记时,我的模板中不会呈现任何内容。我仍然可以访问基于类的视图的URL,它在那里渲染得很好。

在这种情况下,frontpabe/contact.html是典型的基于功能的视图,而frontpage/skills_list.html是基于类的视图。

home.html的:

    <div class="col-lg-4">

      {% block contact %}
      {% include 'frontpage/contact.html' %}
      {% endblock %}

      {% block skills %}
      {% include 'frontpage/skills_list.html' %}
      {% endblock %}

    </div>

contact.html:

{% block contact %}

    {% if errors %}
        <ul>
            {% for error in errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
    {% endif %}

    <form action="" method="post">
    {% csrf_token %}
        <input type="text" name="subject" placeholder="I want a free estimate...">
        <p></p>
        <input type="text" name="email" placeholder="email address (optional)">
        <p></p>
        <textarea name="message" placeholder="here are some things I need..."></textarea>
        <br />
        <input type="submit" value="Submit">
    </form>

{% endblock %}

skills_list.html:

{% block skills %} 

    {% for item in skills_list %}

        <h3 style='background-color:yellow;'> {{ item.skills }} </h3>

    {% endfor %}

{% endblock %} 

2 个答案:

答案 0 :(得分:2)

您的问题与基于功能的视图或基于类的视图无关 - {% include %}标记仅包含模板本身 - 它不会调用视图。它就像你刚刚将联系人或技能模板的文本复制+粘贴到首页模板中一样。

如果没有看到其他代码,我就无法100%确定,但问题的一个可能位置是您的主页的视图类或功能没有变量skill_list,或者如果是的话,它是空的。因此,您的skills_list.html模板正在使用,它只是渲染循环在空列表上的结果(快速检查是添加一点点静态文本,如&#34;你好?&#34;到你skills_list.html之外的{% for ... %};如果你看到了,你肯定会渲染模板。

如果它是一个缺失的skills_list变量,那几乎可以肯定是因为对视图/模板的误解。您可能会在CBV与skills_list.html模板关联中定义该模板 - 但同样,{% include %}标记也不会调用您的视图;它只包含原始模板本身。

答案 1 :(得分:0)

扩展和包含是不同的,不应该一起使用。如果要定义块,则让子模板扩展父级并覆盖块 - 不包括必需的:

<强> home.html的

<div class="col-lg-4">

  {% block contact %}
  {% endblock %}

  {% block skills %}
  {% endblock %}

</div>

<强> contact.html

{% extends 'home.html' %}

{% block contact %}

    {% if errors %}
        <ul>
            {% for error in errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
    {% endif %}

    <form action="" method="post">
    {% csrf_token %}
        <input type="text" name="subject" placeholder="I want a free estimate...">
        <p></p>
        <input type="text" name="email" placeholder="email address (optional)">
        <p></p>
        <textarea name="message" placeholder="here are some things I need..."></textarea>
        <br />
        <input type="submit" value="Submit">
    </form>

{% endblock %}

<强> skills_list.html

{% extends 'home.html' %}
{% block skills %} 

    {% for item in skills_list %}

        <h3 style='background-color:yellow;'> {{ item.skills }} </h3>

    {% endfor %}

{% endblock %} 

或者,您可以使用包含:

<强> home.html的

<div class="col-lg-4">

  {% include 'frontpage/contact.html' %}
  {% include 'frontpage/skills_list.html' %}

</div>

<强> contact.html

    {% if errors %}
        <ul>
            {% for error in errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
    {% endif %}

    <form action="" method="post">
    {% csrf_token %}
        <input type="text" name="subject" placeholder="I want a free estimate...">
        <p></p>
        <input type="text" name="email" placeholder="email address (optional)">
        <p></p>
        <textarea name="message" placeholder="here are some things I need..."></textarea>
        <br />
        <input type="submit" value="Submit">
    </form>

<强> skills_list.html

    {% for item in skills_list %}

        <h3 style='background-color:yellow;'> {{ item.skills }} </h3>

    {% endfor %}