Fixed #33028 -- Used ModelAdmin's opts attribute instead of model._meta.

This commit is contained in:
Marcelo Galigniana 2022-06-20 13:12:00 -03:00 committed by Mariusz Felisiak
parent de74a74b4b
commit d80a258553
3 changed files with 46 additions and 58 deletions

View File

@ -490,10 +490,8 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
Return True if the model associated with this admin should be Return True if the model associated with this admin should be
allowed to be referenced by the specified field. allowed to be referenced by the specified field.
""" """
opts = self.model._meta
try: try:
field = opts.get_field(to_field) field = self.opts.get_field(to_field)
except FieldDoesNotExist: except FieldDoesNotExist:
return False return False
@ -504,7 +502,7 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
# Allow reverse relationships to models defining m2m fields if they # Allow reverse relationships to models defining m2m fields if they
# target the specified field. # target the specified field.
for many_to_many in opts.many_to_many: for many_to_many in self.opts.many_to_many:
if many_to_many.m2m_target_field_name() == to_field: if many_to_many.m2m_target_field_name() == to_field:
return True return True
@ -518,7 +516,7 @@ class BaseModelAdmin(metaclass=forms.MediaDefiningClass):
related_objects = ( related_objects = (
f f
for f in opts.get_fields(include_hidden=True) for f in self.opts.get_fields(include_hidden=True)
if (f.auto_created and not f.concrete) if (f.auto_created and not f.concrete)
) )
for related_object in related_objects: for related_object in related_objects:
@ -653,7 +651,7 @@ class ModelAdmin(BaseModelAdmin):
super().__init__() super().__init__()
def __str__(self): def __str__(self):
return "%s.%s" % (self.model._meta.app_label, self.__class__.__name__) return "%s.%s" % (self.opts.app_label, self.__class__.__name__)
def __repr__(self): def __repr__(self):
return ( return (
@ -688,7 +686,7 @@ class ModelAdmin(BaseModelAdmin):
wrapper.model_admin = self wrapper.model_admin = self
return update_wrapper(wrapper, view) return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.model_name info = self.opts.app_label, self.opts.model_name
return [ return [
path("", wrap(self.changelist_view), name="%s_%s_changelist" % info), path("", wrap(self.changelist_view), name="%s_%s_changelist" % info),
@ -1162,11 +1160,10 @@ class ModelAdmin(BaseModelAdmin):
""" """
match = request.resolver_match match = request.resolver_match
if self.preserve_filters and match: if self.preserve_filters and match:
opts = self.model._meta
current_url = "%s:%s" % (match.app_name, match.url_name) current_url = "%s:%s" % (match.app_name, match.url_name)
changelist_url = "admin:%s_%s_changelist" % ( changelist_url = "admin:%s_%s_changelist" % (
opts.app_label, self.opts.app_label,
opts.model_name, self.opts.model_name,
) )
if current_url == changelist_url: if current_url == changelist_url:
preserved_filters = request.GET.urlencode() preserved_filters = request.GET.urlencode()
@ -1255,11 +1252,10 @@ class ModelAdmin(BaseModelAdmin):
def render_change_form( def render_change_form(
self, request, context, add=False, change=False, form_url="", obj=None self, request, context, add=False, change=False, form_url="", obj=None
): ):
opts = self.model._meta app_label = self.opts.app_label
app_label = opts.app_label
preserved_filters = self.get_preserved_filters(request) preserved_filters = self.get_preserved_filters(request)
form_url = add_preserved_filters( form_url = add_preserved_filters(
{"preserved_filters": preserved_filters, "opts": opts}, form_url {"preserved_filters": preserved_filters, "opts": self.opts}, form_url
) )
view_on_site_url = self.get_view_on_site_url(obj) view_on_site_url = self.get_view_on_site_url(obj)
has_editable_inline_admin_formsets = False has_editable_inline_admin_formsets = False
@ -1290,7 +1286,7 @@ class ModelAdmin(BaseModelAdmin):
"has_absolute_url": view_on_site_url is not None, "has_absolute_url": view_on_site_url is not None,
"absolute_url": view_on_site_url, "absolute_url": view_on_site_url,
"form_url": form_url, "form_url": form_url,
"opts": opts, "opts": self.opts,
"content_type_id": get_content_type_for_model(self.model).pk, "content_type_id": get_content_type_for_model(self.model).pk,
"save_as": self.save_as, "save_as": self.save_as,
"save_on_top": self.save_on_top, "save_on_top": self.save_on_top,
@ -1310,7 +1306,7 @@ class ModelAdmin(BaseModelAdmin):
request, request,
form_template form_template
or [ or [
"admin/%s/%s/change_form.html" % (app_label, opts.model_name), "admin/%s/%s/change_form.html" % (app_label, self.opts.model_name),
"admin/%s/change_form.html" % app_label, "admin/%s/change_form.html" % app_label,
"admin/change_form.html", "admin/change_form.html",
], ],
@ -1440,7 +1436,7 @@ class ModelAdmin(BaseModelAdmin):
}, },
) )
opts = self.model._meta opts = self.opts
preserved_filters = self.get_preserved_filters(request) preserved_filters = self.get_preserved_filters(request)
msg_dict = { msg_dict = {
@ -1507,15 +1503,14 @@ class ModelAdmin(BaseModelAdmin):
return self.response_post_save_change(request, obj) return self.response_post_save_change(request, obj)
def _response_post_save(self, request, obj): def _response_post_save(self, request, obj):
opts = self.model._meta
if self.has_view_or_change_permission(request): if self.has_view_or_change_permission(request):
post_url = reverse( post_url = reverse(
"admin:%s_%s_changelist" % (opts.app_label, opts.model_name), "admin:%s_%s_changelist" % (self.opts.app_label, self.opts.model_name),
current_app=self.admin_site.name, current_app=self.admin_site.name,
) )
preserved_filters = self.get_preserved_filters(request) preserved_filters = self.get_preserved_filters(request)
post_url = add_preserved_filters( post_url = add_preserved_filters(
{"preserved_filters": preserved_filters, "opts": opts}, post_url {"preserved_filters": preserved_filters, "opts": self.opts}, post_url
) )
else: else:
post_url = reverse("admin:index", current_app=self.admin_site.name) post_url = reverse("admin:index", current_app=self.admin_site.name)
@ -1608,8 +1603,6 @@ class ModelAdmin(BaseModelAdmin):
""" """
Determine the HttpResponse for the delete_view stage. Determine the HttpResponse for the delete_view stage.
""" """
opts = self.model._meta
if IS_POPUP_VAR in request.POST: if IS_POPUP_VAR in request.POST:
popup_response_data = json.dumps( popup_response_data = json.dumps(
{ {
@ -1622,8 +1615,8 @@ class ModelAdmin(BaseModelAdmin):
self.popup_response_template self.popup_response_template
or [ or [
"admin/%s/%s/popup_response.html" "admin/%s/%s/popup_response.html"
% (opts.app_label, opts.model_name), % (self.opts.app_label, self.opts.model_name),
"admin/%s/popup_response.html" % opts.app_label, "admin/%s/popup_response.html" % self.opts.app_label,
"admin/popup_response.html", "admin/popup_response.html",
], ],
{ {
@ -1635,7 +1628,7 @@ class ModelAdmin(BaseModelAdmin):
request, request,
_("The %(name)s%(obj)s” was deleted successfully.") _("The %(name)s%(obj)s” was deleted successfully.")
% { % {
"name": opts.verbose_name, "name": self.opts.verbose_name,
"obj": obj_display, "obj": obj_display,
}, },
messages.SUCCESS, messages.SUCCESS,
@ -1643,20 +1636,19 @@ class ModelAdmin(BaseModelAdmin):
if self.has_change_permission(request, None): if self.has_change_permission(request, None):
post_url = reverse( post_url = reverse(
"admin:%s_%s_changelist" % (opts.app_label, opts.model_name), "admin:%s_%s_changelist" % (self.opts.app_label, self.opts.model_name),
current_app=self.admin_site.name, current_app=self.admin_site.name,
) )
preserved_filters = self.get_preserved_filters(request) preserved_filters = self.get_preserved_filters(request)
post_url = add_preserved_filters( post_url = add_preserved_filters(
{"preserved_filters": preserved_filters, "opts": opts}, post_url {"preserved_filters": preserved_filters, "opts": self.opts}, post_url
) )
else: else:
post_url = reverse("admin:index", current_app=self.admin_site.name) post_url = reverse("admin:index", current_app=self.admin_site.name)
return HttpResponseRedirect(post_url) return HttpResponseRedirect(post_url)
def render_delete_form(self, request, context): def render_delete_form(self, request, context):
opts = self.model._meta app_label = self.opts.app_label
app_label = opts.app_label
request.current_app = self.admin_site.name request.current_app = self.admin_site.name
context.update( context.update(
@ -1670,7 +1662,7 @@ class ModelAdmin(BaseModelAdmin):
self.delete_confirmation_template self.delete_confirmation_template
or [ or [
"admin/{}/{}/delete_confirmation.html".format( "admin/{}/{}/delete_confirmation.html".format(
app_label, opts.model_name app_label, self.opts.model_name
), ),
"admin/{}/delete_confirmation.html".format(app_label), "admin/{}/delete_confirmation.html".format(app_label),
"admin/delete_confirmation.html", "admin/delete_confirmation.html",
@ -1723,7 +1715,7 @@ class ModelAdmin(BaseModelAdmin):
initial = dict(request.GET.items()) initial = dict(request.GET.items())
for k in initial: for k in initial:
try: try:
f = self.model._meta.get_field(k) f = self.opts.get_field(k)
except FieldDoesNotExist: except FieldDoesNotExist:
continue continue
# We have to special-case M2Ms as a list of comma-separated PKs. # We have to special-case M2Ms as a list of comma-separated PKs.
@ -1756,9 +1748,6 @@ class ModelAdmin(BaseModelAdmin):
"The field %s cannot be referenced." % to_field "The field %s cannot be referenced." % to_field
) )
model = self.model
opts = model._meta
if request.method == "POST" and "_saveasnew" in request.POST: if request.method == "POST" and "_saveasnew" in request.POST:
object_id = None object_id = None
@ -1780,7 +1769,9 @@ class ModelAdmin(BaseModelAdmin):
raise PermissionDenied raise PermissionDenied
if obj is None: if obj is None:
return self._get_obj_does_not_exist_redirect(request, opts, object_id) return self._get_obj_does_not_exist_redirect(
request, self.opts, object_id
)
fieldsets = self.get_fieldsets(request, obj) fieldsets = self.get_fieldsets(request, obj)
ModelForm = self.get_form( ModelForm = self.get_form(
@ -1855,7 +1846,7 @@ class ModelAdmin(BaseModelAdmin):
title = _("View %s") title = _("View %s")
context = { context = {
**self.admin_site.each_context(request), **self.admin_site.each_context(request),
"title": title % opts.verbose_name, "title": title % self.opts.verbose_name,
"subtitle": str(obj) if obj else None, "subtitle": str(obj) if obj else None,
"adminform": adminForm, "adminform": adminForm,
"object_id": object_id, "object_id": object_id,
@ -1895,7 +1886,7 @@ class ModelAdmin(BaseModelAdmin):
def _get_edited_object_pks(self, request, prefix): def _get_edited_object_pks(self, request, prefix):
"""Return POST data values of list_editable primary keys.""" """Return POST data values of list_editable primary keys."""
pk_pattern = re.compile( pk_pattern = re.compile(
r"{}-\d+-{}$".format(re.escape(prefix), self.model._meta.pk.name) r"{}-\d+-{}$".format(re.escape(prefix), self.opts.pk.name)
) )
return [value for key, value in request.POST.items() if pk_pattern.match(key)] return [value for key, value in request.POST.items() if pk_pattern.match(key)]
@ -1922,8 +1913,7 @@ class ModelAdmin(BaseModelAdmin):
""" """
from django.contrib.admin.views.main import ERROR_FLAG from django.contrib.admin.views.main import ERROR_FLAG
opts = self.model._meta app_label = self.opts.app_label
app_label = opts.app_label
if not self.has_view_or_change_permission(request): if not self.has_view_or_change_permission(request):
raise PermissionDenied raise PermissionDenied
@ -2033,7 +2023,7 @@ class ModelAdmin(BaseModelAdmin):
changecount, changecount,
) % { ) % {
"count": changecount, "count": changecount,
"name": model_ngettext(opts, changecount), "name": model_ngettext(self.opts, changecount),
} }
self.message_user(request, msg, messages.SUCCESS) self.message_user(request, msg, messages.SUCCESS)
@ -2064,7 +2054,7 @@ class ModelAdmin(BaseModelAdmin):
context = { context = {
**self.admin_site.each_context(request), **self.admin_site.each_context(request),
"module_name": str(opts.verbose_name_plural), "module_name": str(self.opts.verbose_name_plural),
"selection_note": _("0 of %(cnt)s selected") % {"cnt": len(cl.result_list)}, "selection_note": _("0 of %(cnt)s selected") % {"cnt": len(cl.result_list)},
"selection_note_all": selection_note_all % {"total_count": cl.result_count}, "selection_note_all": selection_note_all % {"total_count": cl.result_count},
"title": cl.title, "title": cl.title,
@ -2089,7 +2079,7 @@ class ModelAdmin(BaseModelAdmin):
request, request,
self.change_list_template self.change_list_template
or [ or [
"admin/%s/%s/change_list.html" % (app_label, opts.model_name), "admin/%s/%s/change_list.html" % (app_label, self.opts.model_name),
"admin/%s/change_list.html" % app_label, "admin/%s/change_list.html" % app_label,
"admin/change_list.html", "admin/change_list.html",
], ],
@ -2110,8 +2100,7 @@ class ModelAdmin(BaseModelAdmin):
def _delete_view(self, request, object_id, extra_context): def _delete_view(self, request, object_id, extra_context):
"The 'delete' admin view for this model." "The 'delete' admin view for this model."
opts = self.model._meta app_label = self.opts.app_label
app_label = opts.app_label
to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR)) to_field = request.POST.get(TO_FIELD_VAR, request.GET.get(TO_FIELD_VAR))
if to_field and not self.to_field_allowed(request, to_field): if to_field and not self.to_field_allowed(request, to_field):
@ -2125,7 +2114,7 @@ class ModelAdmin(BaseModelAdmin):
raise PermissionDenied raise PermissionDenied
if obj is None: if obj is None:
return self._get_obj_does_not_exist_redirect(request, opts, object_id) return self._get_obj_does_not_exist_redirect(request, self.opts, object_id)
# Populate deleted_objects, a data structure of all related objects that # Populate deleted_objects, a data structure of all related objects that
# will also be deleted. # will also be deleted.
@ -2140,14 +2129,14 @@ class ModelAdmin(BaseModelAdmin):
if perms_needed: if perms_needed:
raise PermissionDenied raise PermissionDenied
obj_display = str(obj) obj_display = str(obj)
attr = str(to_field) if to_field else opts.pk.attname attr = str(to_field) if to_field else self.opts.pk.attname
obj_id = obj.serializable_value(attr) obj_id = obj.serializable_value(attr)
self.log_deletion(request, obj, obj_display) self.log_deletion(request, obj, obj_display)
self.delete_model(request, obj) self.delete_model(request, obj)
return self.response_delete(request, obj_display, obj_id) return self.response_delete(request, obj_display, obj_id)
object_name = str(opts.verbose_name) object_name = str(self.opts.verbose_name)
if perms_needed or protected: if perms_needed or protected:
title = _("Cannot delete %(name)s") % {"name": object_name} title = _("Cannot delete %(name)s") % {"name": object_name}
@ -2164,7 +2153,7 @@ class ModelAdmin(BaseModelAdmin):
"model_count": dict(model_count).items(), "model_count": dict(model_count).items(),
"perms_lacking": perms_needed, "perms_lacking": perms_needed,
"protected": protected, "protected": protected,
"opts": opts, "opts": self.opts,
"app_label": app_label, "app_label": app_label,
"preserved_filters": self.get_preserved_filters(request), "preserved_filters": self.get_preserved_filters(request),
"is_popup": IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET, "is_popup": IS_POPUP_VAR in request.POST or IS_POPUP_VAR in request.GET,
@ -2191,8 +2180,7 @@ class ModelAdmin(BaseModelAdmin):
raise PermissionDenied raise PermissionDenied
# Then get the history for this object. # Then get the history for this object.
opts = model._meta app_label = self.opts.app_label
app_label = opts.app_label
action_list = ( action_list = (
LogEntry.objects.filter( LogEntry.objects.filter(
object_id=unquote(object_id), object_id=unquote(object_id),
@ -2215,9 +2203,9 @@ class ModelAdmin(BaseModelAdmin):
"page_range": page_range, "page_range": page_range,
"page_var": PAGE_VAR, "page_var": PAGE_VAR,
"pagination_required": paginator.count > 100, "pagination_required": paginator.count > 100,
"module_name": str(capfirst(opts.verbose_name_plural)), "module_name": str(capfirst(self.opts.verbose_name_plural)),
"object": obj, "object": obj,
"opts": opts, "opts": self.opts,
"preserved_filters": self.get_preserved_filters(request), "preserved_filters": self.get_preserved_filters(request),
**(extra_context or {}), **(extra_context or {}),
} }
@ -2228,7 +2216,7 @@ class ModelAdmin(BaseModelAdmin):
request, request,
self.object_history_template self.object_history_template
or [ or [
"admin/%s/%s/object_history.html" % (app_label, opts.model_name), "admin/%s/%s/object_history.html" % (app_label, self.opts.model_name),
"admin/%s/object_history.html" % app_label, "admin/%s/object_history.html" % app_label,
"admin/object_history.html", "admin/object_history.html",
], ],
@ -2318,11 +2306,11 @@ class InlineModelAdmin(BaseModelAdmin):
super().__init__() super().__init__()
if self.verbose_name_plural is None: if self.verbose_name_plural is None:
if self.verbose_name is None: if self.verbose_name is None:
self.verbose_name_plural = self.model._meta.verbose_name_plural self.verbose_name_plural = self.opts.verbose_name_plural
else: else:
self.verbose_name_plural = format_lazy("{}s", self.verbose_name) self.verbose_name_plural = format_lazy("{}s", self.verbose_name)
if self.verbose_name is None: if self.verbose_name is None:
self.verbose_name = self.model._meta.verbose_name self.verbose_name = self.opts.verbose_name
@property @property
def media(self): def media(self):

View File

@ -138,7 +138,7 @@ class UserAdmin(admin.ModelAdmin):
raise PermissionDenied raise PermissionDenied
if extra_context is None: if extra_context is None:
extra_context = {} extra_context = {}
username_field = self.model._meta.get_field(self.model.USERNAME_FIELD) username_field = self.opts.get_field(self.model.USERNAME_FIELD)
defaults = { defaults = {
"auto_populated_fields": (), "auto_populated_fields": (),
"username_help_text": username_field.help_text, "username_help_text": username_field.help_text,
@ -155,7 +155,7 @@ class UserAdmin(admin.ModelAdmin):
raise Http404( raise Http404(
_("%(name)s object with primary key %(key)r does not exist.") _("%(name)s object with primary key %(key)r does not exist.")
% { % {
"name": self.model._meta.verbose_name, "name": self.opts.verbose_name,
"key": escape(id), "key": escape(id),
} }
) )
@ -197,7 +197,7 @@ class UserAdmin(admin.ModelAdmin):
"has_delete_permission": False, "has_delete_permission": False,
"has_change_permission": True, "has_change_permission": True,
"has_absolute_url": False, "has_absolute_url": False,
"opts": self.model._meta, "opts": self.opts,
"original": user, "original": user,
"save_as": False, "save_as": False,
"show_save": True, "show_save": True,

View File

@ -41,7 +41,7 @@ class ActionAdmin(admin.ModelAdmin):
return update_wrapper(wrapper, view) return update_wrapper(wrapper, view)
info = self.model._meta.app_label, self.model._meta.model_name info = self.opts.app_label, self.opts.model_name
view_name = "%s_%s_add" % info view_name = "%s_%s_add" % info