Hi django devs, Although Django 1.3 is not released yet I'd like to take advantage of the pycon sprints to discuss a proposal for 1.4: render form widgets using Django templates instead of python code.
This approach is implemented in django-floppyforms [0] (I'm the author): each widget gets a template_name argument, and the render method of each widget renders this template. Floppyforms also provides hooks to inject data in the template context, making it quite easy to implement custom widgets: add some context data, define a custom template and you're done. This approach has a couple of advantages and drawbacks. Advantages: - Templates give you escaping for free, giving us better protection against XSS - Template authors can alter widget rendering more easily - This would also fix the "how do I specify my own doctype?" issue: Django can provide XHTML-style <input/> elements and people can switch to html4-style <input>s by providing their own set of templates. Drawbacks: - Template rendering is slower than string interpolation. There is a benchmark in the floppyforms source tree, for a simple form the rendering takes 9 milliseconds instead of 1.5 milliseconds. With template caching enabled, it drops to 3 milliseconds. It still takes no time but I can see it being an issue. - We need to add a template loader to provide the default form templates without asking the users to add 'django.forms' to their INSTALLED_APPS. Backwards-compatibility is not going to be a big issue: the default templates can implement django's current behaviour. We've been discussing it with Jannis and Carl and I'm trying to start a broader discussion. A side-effect of such a change would be to make the widgets API public and provide hooks for customization. In floppyforms I've been trying to follow the same conventions as the class-based views, using template_name and get_context_data as extension points. I'm happy to work on the patch and convert the admin widgets but I'd like to hear people's voices about: 1) If such a change is desired, and how we can make it faster, 2) how the API should differ from floppyforms, 3) make sure no significant use case is forgotten. This could be part of a broader change related to form rendering (e.g. fieldsets, looping over fields, etc) but I haven't thought about this enough to have a concrete proposal. For more information, see that discussion that happened at Djangocon: https://github.com/SmileyChris/django-forms/wiki/Django-form-API-ideas Regards, Bruno [0] https://github.com/brutasse/django-floppyforms -- You received this message because you are subscribed to the Google Groups "Django developers" group. To post to this group, send email to django-developers@googlegroups.com. To unsubscribe from this group, send email to django-developers+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.