<feed xmlns='http://www.w3.org/2005/Atom'>
<title>django.git/django/contrib/admin/options.py, branch main</title>
<subtitle>django
</subtitle>
<id>http://cgit.adnoto.dev/django.git/atom?h=main</id>
<link rel='self' href='http://cgit.adnoto.dev/django.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/'/>
<updated>2026-04-28T17:44:04Z</updated>
<entry>
<title>Refs #15759 -- Fixed ModelAdmin.list_editable form submission for non-editable instances.</title>
<updated>2026-04-28T17:44:04Z</updated>
<author>
<name>Artyom Kotovskiy</name>
<email>artyomkotovskiy@gmail.com</email>
</author>
<published>2026-04-25T04:00:31Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=5b3cfce51770f46c6dc100e9be7f199a37176762'/>
<id>urn:sha1:5b3cfce51770f46c6dc100e9be7f199a37176762</id>
<content type='text'>
Added formset that excludes objects for which
user has no permission for POST formset as well.

Fixed regression test: the test was not simulating
real behaviour properly. By providing full form
data for the post request we skipped the part
where the user was actually limited in permissions
and only modified some of the rows.

Improved tests by getting rid of obj.id % 2
approach for granting permissions per object
for users, since it is not the safest.
Instead granting permissions simply by 'alive'
parameter, which is simpler and more stable.

Bug in 84db026228413dda4cd195464554d51c0b208e32.
</content>
</entry>
<entry>
<title>Fixed #10919 -- Added delete_confirmation_max_display to ModelAdmin.</title>
<updated>2026-04-23T02:22:55Z</updated>
<author>
<name>Rodrigo Vieira</name>
<email>rodrigo.vieira@gmail.com</email>
</author>
<published>2026-04-22T21:53:27Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=fa2a3de6ede10b005fc2c1d23f4cffb53eaec425'/>
<id>urn:sha1:fa2a3de6ede10b005fc2c1d23f4cffb53eaec425</id>
<content type='text'>
The new ModelAdmin.delete_confirmation_max_display attribute allows
limiting the number of related objects shown on the delete confirmation
page. When the limit is reached, a "…and N more objects." message is shown.

The feature relies on a new truncated_unordered_list template filter
added to django.contrib.admin.templatetags.admin_filters.

Thanks Jacob Tyler Walls for the review and guidance, Tobias McNulty for the report,
and terminator14 for the solution suggested.
</content>
</entry>
<entry>
<title>Fixed #35870 -- Made blank choice label in forms more accessible.</title>
<updated>2026-04-22T21:06:29Z</updated>
<author>
<name>Annabelle Wiegart</name>
<email>annabelle.wiegart@proton.me</email>
</author>
<published>2026-01-18T19:03:28Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=63c56cda133a85a158502891c40465bc0331d3d9'/>
<id>urn:sha1:63c56cda133a85a158502891c40465bc0331d3d9</id>
<content type='text'>
Added new constant django.db.models.fields.BLANK_CHOICE_LABEL for
an accessible and translatable blank choice label in forms.
Deprecated django.db.models.fields.BLANK_CHOICE_DASH constant.
Added the immediately deprecated transitional setting
USE_BLANK_CHOICE_DASH.

Co-Authored-By: Marijke Luttekes &lt;mail@marijkeluttekes.dev&gt;
</content>
</entry>
<entry>
<title>Fixed #15759 -- Excluded fields by per-object permissions for ModelAdmin.list_editable.</title>
<updated>2026-04-22T14:13:58Z</updated>
<author>
<name>Artyom Kotovskiy</name>
<email>artyomkotovskiy@gmail.com</email>
</author>
<published>2026-04-10T04:27:14Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=84db026228413dda4cd195464554d51c0b208e32'/>
<id>urn:sha1:84db026228413dda4cd195464554d51c0b208e32</id>
<content type='text'>
Instead of going over all objects in a queryset and filtering
by user permissions, added skipping while saving the formset
so there is no need to refetch objects again.
</content>
</entry>
<entry>
<title>Refs #15759 -- Factored out _save_formset() in ModelAdmin.</title>
<updated>2026-04-22T14:13:58Z</updated>
<author>
<name>Artyom Kotovskiy</name>
<email>artyomkotovskiy@gmail.com</email>
</author>
<published>2026-04-10T04:23:08Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=512e348bb271878a1e4f1ab6ae187a22dd16222b'/>
<id>urn:sha1:512e348bb271878a1e4f1ab6ae187a22dd16222b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fixed CVE-2026-4292 -- Disallowed instance creation via ModelAdmin.list_editable.</title>
<updated>2026-04-07T11:12:20Z</updated>
<author>
<name>Jacob Walls</name>
<email>jacobtylerwalls@gmail.com</email>
</author>
<published>2026-03-16T22:05:22Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=6afe7ce93964f56e33a29d477c269436f9b60cbf'/>
<id>urn:sha1:6afe7ce93964f56e33a29d477c269436f9b60cbf</id>
<content type='text'>
Thanks Natalia Bidart, Jake Howard, and Markus Holtermann for reviews.
</content>
</entry>
<entry>
<title>Fixed #36127 -- Applied default empty display value to links otherwise containing only whitespace in admin.</title>
<updated>2026-02-20T14:43:41Z</updated>
<author>
<name>SiHyunLee</name>
<email>antoliny0919@gmail.com</email>
</author>
<published>2026-02-20T14:43:41Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=283ea9e9e014adf0013c18700c36b98efa2f0aac'/>
<id>urn:sha1:283ea9e9e014adf0013c18700c36b98efa2f0aac</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fixed #36921 -- Fixed KeyError in inline form for model not registered with admin.</title>
<updated>2026-02-11T23:07:40Z</updated>
<author>
<name>Sean Helvey</name>
<email>sean.helvey@gmail.com</email>
</author>
<published>2026-02-11T23:07:40Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=380d77cccefbe185ddb3f9368d8fdeb7b7cf7108'/>
<id>urn:sha1:380d77cccefbe185ddb3f9368d8fdeb7b7cf7108</id>
<content type='text'>
Regression in b1ffa9a9d78b0c2c5ad6ed5a1d84e380d5cfd010.</content>
</entry>
<entry>
<title>Fixed #36865 -- Removed casting from exact lookups in admin searches.</title>
<updated>2026-01-30T16:45:39Z</updated>
<author>
<name>mlissner</name>
<email>mlissner@michaeljaylissner.com</email>
</author>
<published>2026-01-15T20:30:21Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=4cecf3039586ea738afafb9a28c946bff42c37c1'/>
<id>urn:sha1:4cecf3039586ea738afafb9a28c946bff42c37c1</id>
<content type='text'>
Instead of casting non-text fields to CharField (which prevents index
usage), skip exact lookups when the search term fails
formfield.to_python().

This preserves index usage for valid searches while gracefully handling
invalid search terms by simply not including them in the query for that
field.

For multi-term searches like 'foo 123' on search_fields=['name', 'age__exact']:
- 'foo': invalid for age, so only name lookup is used
- '123': valid for both, so both lookups are used

This entails a slight increase in permissiveness for search terms that
can be normalized by formfield.to_python().
</content>
</entry>
<entry>
<title>Fixed #13883 -- Rendered named choice groups with &lt;optgroup&gt; in FilteredSelectMultiple.</title>
<updated>2026-01-23T02:12:23Z</updated>
<author>
<name>seanhelvey</name>
<email>sean.helvey@gmail.com</email>
</author>
<published>2024-12-13T19:56:53Z</published>
<link rel='alternate' type='text/html' href='http://cgit.adnoto.dev/django.git/commit/?id=b1ffa9a9d78b0c2c5ad6ed5a1d84e380d5cfd010'/>
<id>urn:sha1:b1ffa9a9d78b0c2c5ad6ed5a1d84e380d5cfd010</id>
<content type='text'>
This patch adds support for &lt;optgroup&gt;s in FilteredSelectMultiple widgets.
When a popup returns a new object, if the source field contains optgroup
choices, the optgroup is now also included in the response data.

Additionally, this adds error handling for invalid source_model parameters
to prevent crashes and display user-friendly error messages instead.

Co-authored-by: Michael McLarnon &lt;mmclar@gmail.com&gt;
</content>
</entry>
</feed>
