You can override django admin templates in several ways.
For example, there is django-project as shown below:
django-project
|-core
| └-settings.py
|-app1
| |-models.py
| └-admin.py
|-app2
└-templates
Then, BASE_DIR / 'templates' is set to DIRS in TEMPLATES in settings.py so that templates folder is recognized as shown below:
# "core/settings.py"
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
BASE_DIR / 'templates', # Here
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
And, there are Food and Drink models in app1/models.py as shown below:
# "app1/models.py"
class Food(models.Model):
name = models.CharField(max_length=20)
class Drink(models.Model):
name = models.CharField(max_length=20)
And, there are Food and Drink admins in app1/admin.py as shown below:
# "app1/admin.py"
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
pass
@admin.register(Drink)
class DrinkAdmin(admin.ModelAdmin):
pass
Now, you can override one of the django admin templates change_form.html in templates/admin/, templates/admin/app1/ and templates/admin/app1/food/ as shown below. *You can copy django admin templates from django/contrib/admin/templates/admin/ in your virtual environment and some django admin templates cannot be overridden in templates/admin/app1/ or templates/admin/app1/food/ but these django admin templates can be overridden all in templates/admin/, templates/admin/app1/ and templates/admin/app1/food/ and you can see my answer explaining which django admin templates can be overridden in which directories.
change_form.html in templates/admin/ below can automatically apply to all admins in all apps. *The lowercase folder name admin works properly:
django-project
|-core
| └-settings.py
|-app1
| |-models.py
| └-admin.py
|-app2
└-templates
└-admin
└-change_form.html # Here
change_form.html in templates/admin/app1/ below can automatically apply to all admins in app1. *The lowercase folder name app1 works properly:
django-project
|-core
| └-settings.py
|-app1
| |-models.py
| └-admin.py
|-app2
└-templates
└-admin
|-app1
| └-change_form.html # Here
└-app2
change_form.html in templates/admin/app1/food/ below can automatically apply to food admin in app1. *The lowercase folder name food works properly:
django-project
|-core
| └-settings.py
|-app1
| |-models.py
| └-admin.py
|-app2
└-templates
└-admin
|-app1
| |-food
| | └-change_form.html # Here
| └-drink
└-app2
And now, you can rename change_form.html to custom_change_form.html but custom_change_form.html in any folders cannot automatically apply to any admins in any apps. So, you need to manually apply custom_change_form.html to any admins in any apps which you want to apply custom_change_form.html to.
For custom_change_form.html in templates/admin/ below:
django-project
|-core
| └-settings.py
|-app1
| |-models.py
| └-admin.py
|-app2
└-templates
└-admin
└-custom_change_form.html # Here
Set admin/custom_change_form.html to change_form_template in Food and Drink admins as shown below. *You can find more custom template options:
# "app1/admin.py"
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
change_form_template = 'admin/custom_change_form.html'
@admin.register(Drink)
class DrinkAdmin(admin.ModelAdmin):
change_form_template = 'admin/custom_change_form.html'
For custom_change_form.html in templates/admin/app1/ below:
django-project
|-core
| └-settings.py
|-app1
| |-models.py
| └-admin.py
|-app2
└-templates
└-admin
|-app1
| └-custom_change_form.html # Here
└-app2
Set admin/app1/custom_change_form.html to change_form_template in Food and Drink admins as shown below:
# "app1/admin.py"
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
change_form_template = 'admin/app1/custom_change_form.html'
@admin.register(Drink)
class DrinkAdmin(admin.ModelAdmin):
change_form_template = 'admin/app1/custom_change_form.html'
For custom_change_form.html in templates/admin/app1/food below:
django-project
|-core
| └-settings.py
|-app1
| |-models.py
| └-admin.py
|-app2
└-templates
└-admin
|-app1
| |-food
| | └-custom_change_form.html # Here
| └-drink
└-app2
Set admin/app1/food/custom_change_form.html to change_form_template in Food and Drink admins as shown below:
# "app1/admin.py"
@admin.register(Food)
class FoodAdmin(admin.ModelAdmin):
change_form_template = 'admin/app1/food/custom_change_form.html'
@admin.register(Drink)
class DrinkAdmin(admin.ModelAdmin):
change_form_template = 'admin/app1/food/custom_change_form.html'