#32541: Separate context and rendering in forms
------------------------------------------------+------------------------
               Reporter:  Dylan Verheul         |          Owner:  nobody
                   Type:  Cleanup/optimization  |         Status:  new
              Component:  Forms                 |        Version:  3.1
               Severity:  Normal                |       Keywords:
           Triage Stage:  Unreviewed            |      Has patch:  0
    Needs documentation:  0                     |    Needs tests:  0
Patch needs improvement:  0                     |  Easy pickings:  0
                  UI/UX:  0                     |
------------------------------------------------+------------------------
 I've been working on packages that generate HTML based on Django forms for
 a while. I find myself duplicating certain parts of Django code, because
 there is no clear separation of the context (as in template context) that
 is being generated, and the HTML output. A small example of this is the
 code that renders the HTML for a label.

 
https://github.com/django/django/blob/76c0b32f826469320c59709d31e2f2126dd7c505/django/forms/boundfield.py#L133

 This code takes arguments for and then generates contents (based on actual
 contents and a suffix) and attrs and then generates HTML. It doe snot
 always generate a label tag, which I find weird but is besides the point
 of this issue.

 My suggestion would be to split these kind of functions into a context
 generator

 {{{
 def get_label_tag_context(self, contents=None, attrs=None,
 label_suffix=None):
     ...
     return {
         "contents": ...,
         "suffix": ...,
         "attrs": ...,
     }
 }}}

 And the actual rendering of the tag

 {{{
 def get_label_tag(self, contents=None, attrs=None, label_suffix=None):
     context = self.get_label_tag_context(contents=contents, attrs=attrs,
 label_suffix=label_suffix)
     attrs = flatatt(context["attrs"]) if context["attrs"] else ""
     return format_html('<label{}>{}</label>', attrs, context["contents"])
 }}}

 Now, if I want to write my own label renderer, I can get the exact same
 context that Django uses.

 For widgets, I would like to see the same solution. The context for a
 widget is now part of the rendering process, and contains code that cannot
 be rached unless you use Django rendering. If you want to apply different
 rendering to a widget on a per widget basis, you have to duplicate code or
 hack the generated HTML.

 
https://github.com/django/django/blob/76c0b32f826469320c59709d31e2f2126dd7c505/django/forms/boundfield.py#L80

 Here, a split in generating context and rendering the context would also
 help third party form packages to work with the same data Django has.

 I'm creating this ticket to get feedback on the idea, and to see if a PR
 separating context and rendering in the forms section of Django would be
 welcome. I'd be willing to work on this.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/32541>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/047.f1f9c9c7f3487ac0d10b9066c21d1af5%40djangoproject.com.

Reply via email to