代码之家  ›  专栏  ›  技术社区  ›  user257111

“项目”中的Django应用摘要

  •  0
  • user257111  · 技术社区  · 14 年前

    我正在努力找出如何最好地做我认为我想做的事情-现在可能是我没有正确的理解什么是最佳实践,所以如果没有,请随意对我吼叫等。

    在这上面加上一些背景(这离我想要达到的目标并不遥远):

    假设,我正在建立一个网站。我的网站有一个外观和感觉,我已经定义了一个 base.html 一个没有模型的django应用程序中的样板和各种css项。

    urls 从我的项目中的应用程序文件夹,完成。

    我脑子里想不通的是模板如何适应:在我的应用程序中,我想提供这样一个模板:

    <div class="entry">
    <a href=""><h2>{{ entry.Title }}</h2></a>
    <p>Published on: {{ entry.date_published|date:"j F Y" }}</p>
    {{ entry.body_html }}
    </div>
    <a href="">X comments.</a>&nbsp;<a href=""">Add Comment</a>&nbsp;<a href="">Link</a>
    
    <div id="commentdiv">
    {% if comments %}
        <ul id="commentlist">
        {% for comment in Comments %}
            <li></li>
        {% endfor %}
        </ul>
    {% else %}
        <p>There are no comments on this entry.</p>
    {% endif %}
    
    </div>
    

    查看条目,所以在我的网站上 sitename.com/blog/...someparameters.../entryname' where blog is the 包括 in 网址.py`有问题的根项目的。一切都很好,但我如何也附加从该项目的样板,即外观和感觉?我可以全力以赴为博客应用程序设计一个基本模板,这很公平,但是导航等呢?我可能希望在每个页面上都包含相同的标题,即使内容相当多样化。

    现在,我知道了{%extends“template”%}指令和{%include template%}指令。据我所知,为什么这些不起作用:

    • {%extends%}-如何知道/提供我要从根项目扩展的内容?如果你能为此提供一个机制,我认为它会很好地解决这个问题。
    • {%include%}-意味着我必须在根项目的引导应用程序中为博客提供视图。我真的不想这样做-如果是这样的话,我还不如把整个项目都搬到那里去。

    编辑 this question 与我所问的非常相似,并记下了答案。然而,他们仍然不满足。

    3 回复  |  直到 7 年前
        1
  •  1
  •   Peter Rowell    14 年前

    Custom Template Tag . 在它中,您可以做任何您想做的事情:对标记使用0个或更多的参数来获取和操作任意对象,然后“手动”调用模板引擎来获取要返回的代码段。例如。

    [...]
    t = loader.get_template('sometemplate.html')
    c = Context({
        'my_data': my_data, # or whatever
    })
    return t.render(c) # this gets inserted into the invoking template
    

    如果你不想让网站的各种“主模板”进行{%加载。。。%}然后您可以在app目录的\uu init \uuuuy.py中粘贴如下内容:

    from django import template
    template.add_to_builtins('myapp.templatetags.myapptags')
    

    这使得它可以在网站的任何地方,就像任何其他内置的。

        2
  •  0
  •   Bernhard Vallant    14 年前

    template inheritance 以一种有意义的方式使用django,您不仅需要使用 {% extends %} 标签也是 {% block %} 标签!在基本模板中指定应用程序需要替换的块:例如:

    <html>
        <body>
             <div id="content">
             {% block "content" %}
             {% endblock %}
             </div>
        </body>
    </html>
    

    然后,您可以使用模板继承轻松地用应用程序填充div的内容:

    {% extends "base.html" %}
    {% block "content" %}
        The content generated by your app.
    {% endblock %}
    

    您应该记住,Django的模板语言也试图实现不重复自己的概念,所以尽量避免重复块的继承/包含,它将给您一个更好的项目来维护!

        3
  •  0
  •   Clueless    14 年前

    典型的方法是使用一个基本模板,在你的应用程序中扩展它,用你的应用程序的内容替换任何你喜欢的块,并使用模板标签从其他应用程序中引入内容。

    例如:

    基本.html(在项目模板中):

    <html>
      <head>
        <title>{% block "title" %}Default title{% endblock %}</title>
      </head>
      <body>
        <div id="nav">{% block "nav" %}{% endblock %}</div>
        <div id="content">{% block "content" %}{% endblock %}</div>
      </body>
    </html>
    

    {% extends "base.html" %}
    
    {% load other_app_tags %}
    
    {% block "nav" %}
      {% other_app_nav_tag %}
    {% endblock %}
    
    {% block "content" %}
      lotsa good junk.
    {% endblock %}
    

    其他应用程序_标签.py(在其他应用程序的templatetags目录中):

    from django import template
    
    register = template.Library()
    
    @register.inclusion_tag('navigation.html')
    def other_app_nav_tag():
        # You could give this tag arguments to change how it behaves
        return {
            'links': {
                'Home': '/home'
            }
        }
    

    <ul>
    {% for text, target in links %}
      <li><a href="{{ target }}">{{ text }}</a></li>
    {% endfor %}
    </ul>
    

    inclusion tags 从其他应用程序的模板渲染。这是一个很好的方法,将模板包含到他们自己的相关应用程序中,并且仍然可以在整个网站上使用它们。