diff options
| author | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2023-07-07 08:06:01 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-07 08:06:01 +0200 |
| commit | f64fd47a7627ed6ffe2df2a32ded6ee528a784eb (patch) | |
| tree | 1abf1f8f945e9b72a72d31ec00f356e1088c4538 /django/contrib/admin/options.py | |
| parent | d569c1dcfeb26ca9ee391e5dfeadedf2b5ed4253 (diff) | |
Fixed #9602 -- Added AdminSite.get_model_admin().
This allows retrieving an admin class for the given model class without
using internal attributes.
Diffstat (limited to 'django/contrib/admin/options.py')
| -rw-r--r-- | django/contrib/admin/options.py | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index b0635669e9..f9760664dd 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -160,6 +160,8 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass): If kwargs are given, they're passed to the form Field's constructor. """ + from django.contrib.admin.sites import NotRegistered + # If the field specifies choices, we don't need to look for special # admin widgets - we just need to use a select widget of some kind. if db_field.choices: @@ -185,23 +187,27 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass): # rendered output. formfield can be None if it came from a # OneToOneField with parent_link=True or a M2M intermediary. if formfield and db_field.name not in self.raw_id_fields: - related_modeladmin = self.admin_site._registry.get( - db_field.remote_field.model - ) - wrapper_kwargs = {} - if related_modeladmin: - wrapper_kwargs.update( - can_add_related=related_modeladmin.has_add_permission(request), - can_change_related=related_modeladmin.has_change_permission( + try: + related_modeladmin = self.admin_site.get_model_admin( + db_field.remote_field.model + ) + except NotRegistered: + wrapper_kwargs = {} + else: + wrapper_kwargs = { + "can_add_related": related_modeladmin.has_add_permission( request ), - can_delete_related=related_modeladmin.has_delete_permission( + "can_change_related": related_modeladmin.has_change_permission( request ), - can_view_related=related_modeladmin.has_view_permission( + "can_delete_related": related_modeladmin.has_delete_permission( request ), - ) + "can_view_related": related_modeladmin.has_view_permission( + request + ), + } formfield.widget = widgets.RelatedFieldWidgetWrapper( formfield.widget, db_field.remote_field, @@ -246,8 +252,13 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass): ordering. Otherwise don't specify the queryset, let the field decide (return None in that case). """ - related_admin = self.admin_site._registry.get(db_field.remote_field.model) - if related_admin is not None: + from django.contrib.admin.sites import NotRegistered + + try: + related_admin = self.admin_site.get_model_admin(db_field.remote_field.model) + except NotRegistered: + return None + else: ordering = related_admin.get_ordering(request) if ordering is not None and ordering != (): return db_field.remote_field.model._default_manager.using(db).order_by( |
