Hi, Proposal: Make it possible to use the same template block name twice, if the second one is nested within the first one. Inheriting from the template fills in the innermost block.
---------------------- Background (why is this useful?): Say you have one base.html template defining a {% block content %}, and ten templates inheriting from it and defining the contents of the block. Now you decide that five of those templates actually should have a warning message at the top, and you decide to make a new base_with_warning.html template. You should should now be able to just change what block five of the templates inherit from, add the warning to your new base template, and be done with it? Not really. Your base_with_warning.html would have to look like this: {% extends "base.html" %} {% block content %} <div class="warning">Be careful when changing these settings!</div> {% block content %}{% endblock %} {% endblock %} And this doesn't work in Django because duplicate block names are not allowed. I think making this possible would make cases like the one I'm describing above much easier to handle. ---------------------- Alternatives (this is how you should solve it instead...): There are other ways to solve the problem I'm describing above. Let me list a few and talk about the problems I see with them: 1) Create a new template block in base_with_warning.html and change the five templates to use that block instead. Problem: This puts the burden on developers to remember all kinds of content blocks they have in this project, and change them depending on what template they happen to be inherit from. The interface to the developer working on a new child template is much cleaner if they know they can always use the content block, and that the template they inherit from with handle the rest. 2) Make a child templates call super, and put the warning div inside the content block in base_with_warning.html. Problem: It's very easy to forget calling super when making a new template. It quickly becomes repetitive to type block.super in each of the templates. Should I call super in the five templates without a warning too? Just to be sure it isn't forgotten if someone changes the inherited template. 3) Use an include tag in each of the child templates instead of inheriting. Problem: This is just as repetitive as copy-pasting the div to each of the subtemplate, it's just the {% include "warning.html" %} is a shorter string to copy-paste. As with all copy-paste, it makes it easy miss one instance when changing the others. Not maintainable. 4) Use a template variable to decide whether to render the warning or not. Problem: This moves the copy-paste to the view logic. Now I need to remember to pass the right variable in the view instead, with the same problem as with copy-paste above. 5) Write a custom template tag that does what I want. Problem: I really don't know how to do this, and I haven't found someone that has written a tag like that after are plenty of googling. ---------------------- Backwards compatibility (this will not break stuff!): Since duplicate block names are not allowed today, this change would be 100% backwards compatible. Everything would continue working as it always has. ---------------------- FAQ: a) How would you inherit from a template with duplicate blocks with the same name? This proposal only deals with the case where the first block is defined inside the second block. If this happens the child templates content should fill the INNER block, not the outer one. There would be no way to override the outer block, since that would be shadowed by the redefined inner block. b) If we allow for multiple blocks with the same name, what should happen with two blocks side by side (not nested)? We wouldn't allow that. This proposal is only about duplicate blocks when nested inside eachother. All other duplication would still yield the same error. c) I have another suggestion that solves your problem without the problems with 1) - 5) above, that doesn't require a change in django? That really isn't a question, but fine :) Bring it on! I'm really interested in solving the problem described in the background section in a clean way, not a particular tech solution. d) Do other people have this problem? I've found a few: http://stackoverflow.com/questions/15448211/django-template-block-overriding/ - http://stackoverflow.com/questions/8717521/django-multi-level-template-extends-and-nested-blocks - This could also be used to handle nicely breadcrumbs in multiple levels. You can probably think of more use-cases. e) Is this the same as Ticket #4529: https://code.djangoproject.com/ticket/4529 ? No. The code in that ticket would still not work. ---------------------- Next steps: I'm very eager to hear your thoughts on this, and maybe, if you think this is a good idea, start to write up a ticket. ---------------------- Thanks for reading this far! I love the work you all do on making Django better! -- 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 django-developers+unsubscr...@googlegroups.com. To post to this group, send email to django-developers@googlegroups.com. Visit this group at http://groups.google.com/group/django-developers?hl=en. For more options, visit https://groups.google.com/groups/opt_out.