Hi David.
Thanks for this. Sorry for the slow pick-up: DjangoCon this week. :)
I'd say option 1: It's an accessibility change and we should just opt people into that. IIRC there are some small improvements to the current HTML (aria roles and such) that would improve accessibility even if not perfectly. We should add those. (Folks can revert to the old templates if they must, assuming we note the changes.)
With the template based rendering in place, I'd think (though) we could eventually move away from `as_p` &co.
Rather you'd set the (base) `template_name` for the form, or override `django/forms/default.html`, which in the PR proxies to `table.html` to maintain the current behaviour, and then rely on `__str__()`, i.e. you'd do `{{ form }}`.
If we keep `table.html`, `ul.html` and `p.html`, folks who are using `{{ form }}` now can add the `as_*` as needed to keep the current output (modulo the aria type changes).
We should then be free to introduce a better `default.html` that addresses the accessibility issues more comprehensively. I think there's no problem heading towards this.
I think we do have to leave that fallback though: I'd guess the number of projects using `as_p` &co somewhere is legion; just changing the HTML would be a pretty big break without a fallback... 🤔 Whether it's worth the disruption to formally deprecate and remove these methods I don't know... We could add a warning to as_p &co to say "This method has accessibility issues" if we wanted to steer people away — There's probably value if having two or three different examples of how you could render a form, especially if we can solve the worst of the accessibility concerns.