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.

P.S. This is a copy/paste from https://code.djangoproject.com/ticket/32541, 
I got the suggestion to check here.

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers  (Contributions to Django itself)" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-developers+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-developers/73e586b8-4d66-4a43-b63a-2c8a5edf1e6cn%40googlegroups.com.

Reply via email to