【问题标题】:Multiple Templates, Complex View or Creative Model多个模板、复杂视图或创意模型
【发布时间】:2013-11-26 17:37:53
【问题描述】:

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

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

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

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

或者,有没有为每个页面使用模型的解决方案?

DRY 似乎倾向于使用视图复杂的单个模板,但我的直觉似乎想认为多个模板更易于维护。

感谢您的意见。

【问题讨论】:

    标签: python django templates model-view-controller


    【解决方案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>
    

    然后在特定的.html中

    {% extends 'base.html' %}
    
    {% block content %}
        <p>specific content that will be shown instead</p>
    {% endblock %}
    

    块可以很小,不必被覆盖,例如用法

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

    很常见

    【讨论】:

    • 我很清楚这一点。我的问题是制作多个模板(例如扩展基础)是否更好,其中所有标记都相同,只有内容会改变。我相信如果我创建了 3 个模板都具有相同的标记并且只有内容发生变化,我将违反 DRY 原则。
    • 啊,好吧,如果您可以使模板足够通用,那么重用同一个模板就太好了。几个不同的视图可以用不同的上下文渲染同一个模板。
    • 感谢您,因为我没有考虑过做不同观点的可能性,我想我会使用一种观点并区分回报。一个模板的多个视图绝对是答案。谢谢!
    【解决方案2】:

    您可以使用所有&lt;head&gt;&lt;script&gt; 等元素和

    创建一个site_base.html
    <!-- HEAD -->
      {% block content %}
        <div class='container' id="default_container">
          Your default content
        </div>
      {% endblock content %}
    <!-- FOOT -->
    

    然后在您的 urls.py 中确定“路径” - 指向您的视图的 URL。如果你想要一个简单的平面页面,你可以把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
    

    【讨论】:

    • 这仍然没有回答我的问题。我是创建三个具有相同标记且仅更改硬编码内容的模板,还是创建一个模板并在视图中动态加载内容?
    • 这取决于你必须做什么。杂志文章 - 将内容从数据库模型传递到模板上下文。信息网站的静态页面 - 写 blocks。如果您创建一个“static_base”并使用它,您将处于最佳状态。我宁愿使用多个模板部分并将它们包含到我的基础中。
    猜你喜欢
    • 2019-04-10
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多