﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
36708	`formset` not a static attribute of `ChangeList`	Ben Gregory	Rudraksha Dwivedi	"The `ChangeList` class is used in Django Admin to determine and configure the functionality of a model's `change_list` admin page.

I have been experimenting with using `ChangeList` for my own purposes, to create a custom page not dissimilar to `change_list.html`.

I have noted that in doing so, I have needed to set the attribute `formset = None` on my `ChangeList` instance, to satisfy an expectation of the `admin_list.result_list` [https://github.com/django/django/blob/e27cff68a32a0183c6b8d110b359c1c858f68cd7/django/contrib/admin/templatetags/admin_list.py#L328 template tag]. This is because `formset` is not a static attribute of the class.

Looking at the source code, the [https://github.com/django/django/blob/e27cff68a32a0183c6b8d110b359c1c858f68cd7/django/contrib/admin/options.py#L2056 `django.contrib.admin.options`] module sets `formset` on the `ChangeList` instance.

Outside of tests, `ChangeList` objects are only instantiated in the above module, and as said above, will always be assigned a `formset` attribute. See [https://github.com/search?q=repo%3Adjango%2Fdjango+%2F%28%3F-i%29ChangeList%2F+language%3APython&type=code&l=Python here]. So, it appears to me that there is an assumption that instances of this class should _always_ have a `formset` attribute.

I propose we simply make `formset` an attribute of `ChangeList`, rather than assign it dynamically in the aforementioned function. This will mean developers working low-level in the admin needn't write a line of code to be able to use their custom `ChangeList` objects with the relevant template tags, and will serve to better document the expected attributes of `ChangeList` objects more generally.

Proposal:

https://github.com/django/django/blob/e27cff68a32a0183c6b8d110b359c1c858f68cd7/django/contrib/admin/views/main.py#L67:

{{{
+ formset = None
}}}

https://github.com/django/django/blob/e27cff68a32a0183c6b8d110b359c1c858f68cd7/django/contrib/admin/options.py#L2056:

{{{
-         formset = cl.formset = None
+         formset = None
}}}

One could also argue that this is an opportunity to remove this notation `formset = cl.formset = *`, and use `cl.formset` directly."	Cleanup/optimization	closed	contrib.admin	dev	Normal	fixed	ChangeList	Antoliny	Ready for checkin	1	0	0	0	1	0
