多个模板,复杂视图或创意模型

时间:2013-11-26 17:37:54

标签: python django templates model-view-controller

我是Django的新手,我很难决定设计模板的最佳方法。到目前为止,我开发网站的方式相对简单。我现在处于一个主页,其中三个不同的锚标签指向同一模板,但最终将根据选择的链接动态生成。

我的问题是哪种解决方案最好:

我应该为它所代表的唯一网址构建三个独立的(让我们称之为路径)模板吗?

我应该构建一个单独的模板然后加强我的视图并传入一个变量并从一个模板生成它,根据输入返回任何必要的数据。

或者,是否有针对每个页面使用模型的解决方案?

DRY似乎适用于视图中具有复杂性的单个模板,但我的直觉似乎想要认为多个模板更容易维护。

感谢您的意见。

2 个答案:

答案 0 :(得分:1)

您可以使用所有site_base.html<head>等元素并使用

制作<script>
<!-- HEAD -->
  {% block content %}
    <div class='container' id="default_container">
      Your default content
    </div>
  {% endblock content %}
<!-- FOOT -->

然后在您的urls.py中确定“路径” - 您的观点的网址。如果您想要一个简单的平面页面,可以添加一个TemplateView.as_view(template_name = "page_1.html")

urlpatterns = patterns('',
    (r'^$', TemplateView.as_view(template_name='site_base.html')),
    (r'^page_1/$', TemplateView.as_view(template_name='page_1.html')),
)

和您的page_1.html

{% extends 'site_base.html' %}

{% block content %}
  <div class='container' id="page_1">
    Your Page 1 content that will overwrite `block content` tag from site_base.html
  </div>
{% endblock content %}

您可以放置​​所需的任何{% block }%标签 我有时会使用我的Flat应用。它搜索名称来自url的模板或返回404。

# urls.py
from views import flat_render_view

urlpatterns = patterns('',
    url(r'^(?P<template_name>\w+)/$', flat_render_view, name='flat_view'),
)

# views.py
from django.http.response import Http404
from django.template.base import TemplateDoesNotExist
from django.shortcuts import render

def flat_render_view(request, **kwargs):
    try:
        return render(request, "flat_pages/%s.html" % kwargs['template_name'])
    except TemplateDoesNotExist:
        raise Http404

答案 1 :(得分:1)

使用django,您可以使用{% extends %}模板标记继承另一个模板,然后覆盖您需要具体的{% block %}

base.html文件

<html>
    <head>
       <js and css etc>
    </head>
    <body>
    <some more html />
    {% block content %}
        <p>generic content that wont be shown if you render specific.html</p>
    {% endblock %}
    </body>
</html>

然后在specific.html

{% extends 'base.html' %}

{% block content %}
    <p>specific content that will be shown instead</p>
{% endblock %}

块可以很小并且不必被覆盖,例如

<body class="{% block bodyclass %}{% endblock %}">

很常见

相关问题