如何重用Django模板?

时间:2017-08-28 18:18:45

标签: html django html5 python-3.x templates

目前,我有几乎两个完全相同的模板,并且它们使用相同的Django表单,但只有一个参数在这两个表单中发生变化,即操作方法,即

Django表格

class DropDownMenu(forms.Form):
    week = forms.ChoiceField(choices=[(x,x) for x in range(1,53)]
    year = forms.ChoiceField(choices=[(x,x) for x in range(2015,2030)]

模板1

<form id="search_dates" method="POST" action="/tickets_per_day/">
    <div class="row">
       <div style="display:inline-block">
            <h6>Select year</h6>
              <select name="select_year">
                <option value={{form.year}}></option>
              </select>
       </div>
    <button type="submit">Search</button>
  </div>
</form>

模板2

<form id="search_dates" method="POST" action="/quantitative_analysis/">
    <div class="row">
       <div style="display:inline-block">
            <h6>Select year</h6>
              <select name="select_year">
                <option value={{form.year}}></option>
              </select>
       </div>
    <button type="submit">Search</button>
  </div>
</form>

唯一不同的是动作方法,所以我想知道是否可以重用一个仅在动作方法中有所不同的模板。如果有可能,你能帮我解决一下代码吗?

我查看了这个问题django - how to reuse a template for nearly identical models?,但我没有在我的模板中使用任何模型。

3 个答案:

答案 0 :(得分:7)

当然有办法。 {% include %}救援!

为表单创建一个基本模板,如下所示:

<!-- form_template.html -->

<form id="search_dates" method="POST" action="{{ action }}">
    <div class="row">
       <div style="display:inline-block">
            <h6>Select year</h6>
              <select name="select_year">
                <option value={{form.year}}></option>
              </select>
       </div>
    <button type="submit">Search</button>
  </div>
</form>

注意占位符action。我们将在下一步中使用它。

现在,您只需编写:

即可重复使用此模板
<!-- a_template.html -->

{% include 'form_template.html' with action='/tickets_per_day/' %}


<!-- b_template.html -->

{% include 'form_template.html' with action='/quantitative_analysis/' %}

答案 1 :(得分:1)

根据您的观点,您可以在上下文中传递action并在模板中使用它,这样您就不必创建两个单独的模板。假设两个视图使用的模板名称为abc.html

def my_view_a(request):
    ctx = {'action': '/tickets_per_day/'}
    return render(request, 'abc.html', ctx)

def my_view_b(request):
    ctx = {'action': '/quantitative_analysis/'}
    return render(request, 'abc.html', ctx)

然后在模板中你会做:

<form id="search_dates" method="POST" action="{{ action }}">

在上面的代码中,操作更难以编码,以便使用reverse按名称解析网址路径:

ctx = {'action': reverse('namespace:url_name')}  # replace namespace and url_name with actual values

答案 2 :(得分:0)

template2

中使用此功能
{% include "template1.html" with form=form %}

它会起作用。