I would like to see someone do a review of the various third party implementations of concepts like this, I think there's a place in core for some variant, it's just working out which one the "right" one is.
The other issue with adding new tags to core (especially with "common" names) is name clashes with third party code. This shouldn't be too significant though if we have enough use. On 4 September 2014 12:09, Josh Smeaton <[email protected]> wrote: > I really like this idea, and have wanted something similar every time I > start a new project and begin building out the main template. I think > including this (or something like this) in core is a great idea. Just > because it *can* be implemented in 3rd party code, doesn't mean it has to > be. > > > On Thursday, 4 September 2014 02:10:33 UTC+10, Sam Willis wrote: >> >> Hi All, >> >> I would like to propose a new template tag to be included in Django, it >> is sort of a cross between 'include' and 'extends'. You can find an >> implementation here: https://gist.github.com/ >> samwillis/af3992f69c2597a16252 >> >> The main use case for this tag is being able to create reusable >> 'components' for rendering a website. Say for example a page header, a >> panel with headers and footers, or a modal window (as seen in the Bootstrap >> framework). Rather than needing to repeat the html everywhere you need it >> and having to search out all occurrences to make a change to the structure >> you can create a simple template and include it. >> >> To some extent this can currently be done with either an included >> template using the '{% include "template.html" with var="value" %}' syntax >> or using a custom template tag. However, the former isn't suitable for >> changing whole blocks in the include template, and the latter can be >> overkill and may not be suitable for a designer with little knowledge of >> Python and the Django Template API. >> >> The 'use' tag loads a template and renders it with the current context >> similar to the 'include' tag. You can pass additional context using keyword >> arguments as well as override blocks in the included template. >> >> Example (simple) template: >> >> <div class="page-heading {{ extra_class }}"> >> <h1>{% block heading %}{% endblock %}</h1> >> </div> >> >> Example 'use' tag use with the above template: >> >> {% use "page_header.html" %} >> {% block heading %}Some Title{% endblock %} >> {% enduse %} >> >> {% use "page_header.html" with extra_class="large" %} >> {% block heading %}Some Title{% endblock %} >> {% enduse %} >> >> As with 'include' use the 'only' argument to exclude the current context >> when rendering the included template: >> >> {% use "page_header.html" only %} >> {% block heading %}Some Title{% endblock %} >> {% enduse %} >> >> {% use "page_header.html" with extra_class="large" only %} >> {% block heading %}Some Title{% endblock %} >> {% enduse %} >> >> The included template receives an additional context variable called >> 'used_blocks' which is a Dict indicating which blocks were overridden in >> the 'use' tag. Using this you can conditionally show content around the >> block. For example, if you had this template for generating a page heading: >> >> <div class="page-heading"> >> <h1>{% block heading %}{% endblock %}</h1> >> {% if used_blocks.sub_heading %} >> <h2>{% block sub_heading %}{% endblock %}<h2> >> {% endif %} >> </div> >> >> and included it using: >> >> {% use "page_header.html" %} >> {% block heading %}My Page Title{% endblock %} >> {% enduse %} >> >> it would exclude the '<h2>' tags from the empty subheading. >> >> Finally, as syntactic sugar if you are just overriding a single block you >> can express it as: >> >> {% use "page_header.html" block heading %} >> My Page Title >> {% enduse %} >> >> These example are a little simple, but this could be incredibly useful >> for more complex components such a modal windows. >> >> I have made a first pass at an implementation here: >> https://gist.github.com/samwillis/af3992f69c2597a16252. >> >> Although I have implemented this with the 'use' word, there may be a >> better word. I considered 'embed' but thought 'use' was a little cleaner >> >> Thanks, >> Sam >> >> -- > You received this message because you are subscribed to the Google Groups > "Django developers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/django-developers. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-developers/bb252615-f881-4233-a69b-ae40faf3a694%40googlegroups.com > <https://groups.google.com/d/msgid/django-developers/bb252615-f881-4233-a69b-ae40faf3a694%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Django developers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/django-developers. To view this discussion on the web visit https://groups.google.com/d/msgid/django-developers/CAMwjO1FwsTseY7FSF5bOHGzMv93ud-qTGwGu-hZByZScOcP3fQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
