Brilliant! I wasn't looking an answer to this question, and wasn't all that aware of how these interacted, but it will sure come in handy. Thanks for the extremely clear, concise explanation. I don't think the Django docs make it quite that clear.
Furbee On Tue, Dec 13, 2011 at 3:49 PM, Russell Keith-Magee < russ...@keith-magee.com> wrote: > On Wed, Dec 14, 2011 at 6:21 AM, Jason <1jason.whatf...@gmail.com> wrote: > > Hi there, > > > > I love the concept of DRY, and django's enthusiasm for this concept. In > > light of this I have tried to have a template extend a template, but it > > doesn't seem to work. Is there a better way than what I'm currently > doing? > > Yes :-) > > > The current way > > > > index.html > > > > {% if current_user %} > > {% extends "_logged_out_template.html" %} > > > > {% else %} > > {% extends "_logged_in_template.html" %} > > {% endif %} > > > > contact.html > > > > {% if current_user %} > > > > {% extends "_logged_out_template.html" %} > > > > {% else %} > > > > {% extends "_logged_in_template.html" %} > > > > {% endif %} > > > > > > > > The way I would like it to be (but it didn't work) > > > > index.html > > {% extends "_base_template.html" %} > > > > _base_script.html > > > > {% if current_user %} > > > > {% extends "_logged_out_template.html" %} > > > > {% else %} > > > > {% extends "_logged_in_template.html" %} > > > > {% endif %} > > This sample suggests that you may have some misunderstandings about > how Django's template language -- and the {% extends %} tag in > particular -- are supposed work. > > {% extends %} is *not* the same as {% include %}. A template can only > *extend* a single other template. The natural partner of {% extends %} > is the {% block %} tag. > > Django also has an {% include %} statement, but {% extends %} and {% > block %} are generally more efficient (and, in my experience, > flexible) > > {% extends %} is the only special case in Django's template parser. > The extends tag is parsed separately from the rest of the tags > (specifically so that it can interact with {% block %} tags), and as a > result, the {% block %} tag doesn't interact with {% if %} or other > logical constructs. The Django parser works out what templates are > being extended, creating a single template, and *then* sorts out the > page logic. > > Working with an {% include %} tag is a bit like a "top down" design -- > you have a final product in mind, which you construct by assembling > lots of smaller snippets. {% extends %} is more like a bottom up > design -- you establish a basic structure, and then work out how a > specific page modifies the basic structure. > > Looking at your example, it's not entirely clear what you're trying to > achieve; hopefully the following example will give you an idea of how > {% extends %} and {% block %} work together: > > base.html: > > {% block header %}My Site{% endblock %} > {% block body %}{% endblock %} > {% block footer %}Thanks for coming{% endblock %} > > index.html > {% extends "base.html" %} > {% block body %} > This is the index > {% endblock %} > > detail.html > {% extends "base.html" %} > {% block body %} > This is the detail > {% endblock %} > > This will result in two pages -- an index and a detail page. Both have > a header that reads "My Site", and a footer that says "thanks for > coming"; however, the actual content in the body changes depending on > the template. > > This sort of structure can then be layered -- so, for example, if > there are many different types of detail page, you can have a "base > detail" page that defines the blocks that exist on detail pages, and > then specific detail pages that extend the base detail page. > > I hope this makes the design motivation of Django's template language > a little more clear. > > Yours, > Russ Magee %-) > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To post to this group, send email to django-users@googlegroups.com. > To unsubscribe from this group, send email to > django-users+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/django-users?hl=en. > > -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.