In FruitAdmin():
, you also need to override save_model() like below so that obj.save()
works only when adding data on Add fruit. *obj.save()
is really important:
# "store/admin.py"
from django.contrib import admin
from .models import Fruit
@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):
def response_change(self, request, obj):
obj.name = obj.name.upper()
obj.save()
return super().response_change(request, obj)
def save_model(self, request, obj, form, change): # Here
last_part_of_path = request.path.split('/')[-2]
if last_part_of_path == "add":
obj.save() # Here
Then, if you input orange
to Name: on Change fruit as shown below:

Then, the name is successfully changed from APPLE
to ORANGE
capitalized as shown below:

Then, the useless UPDATE
query is removed as shown below:

Be careful, if you override save_model()
with pass
as shown below:
# "store/admin.py"
from django.contrib import admin
from .models import Fruit
@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):
def response_change(self, request, obj):
obj.name = obj.name.upper()
obj.save()
return super().response_change(request, obj)
def save_model(self, request, obj, form, change): # Here
pass # Here
You cannot add data on Add fruit while you can change data on Change fruit:

But, if you really want to override save_model()
with pass
and want to add and change data, you also need to override response_add() with obj.save()
as shown below. *Again obj.save()
is really important:
# "store/admin.py"
from django.contrib import admin
from .models import Fruit
@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):
def response_change(self, request, obj):
obj.name = obj.name.upper()
obj.save()
return super().response_change(request, obj)
def save_model(self, request, obj, form, change):
pass
def response_add(self, request, obj, post_url_continue=None): # Here
obj.save() # Here
return super().response_add(request, obj, post_url_continue)
Then, you can add data on Add fruit as show below:

In addition, if you also want to capitalize the name which a user inputs on Add fruit as shown below:

You need to add obj.name = obj.name.upper()
to response_add()
as shown below:
# "store/admin.py"
from django.contrib import admin
from .models import Fruit
@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):
def response_change(self, request, obj):
obj.name = obj.name.upper()
obj.save()
return super().response_change(request, obj)
def save_model(self, request, obj, form, change):
pass
def response_add(self, request, obj, post_url_continue=None): # Here
obj.name = obj.name.upper() # Here
obj.save()
return super().response_add(request, obj, post_url_continue)
Or, you only need to override save_model()
like below without response_change()
and response_add()
:
# "store/admin.py"
from django.contrib import admin
from .models import Fruit
@admin.register(Fruit)
class FruitAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change): # Here
obj.name = obj.name.upper()
obj.save()
Then, you can capitalize the name which a user inputs on Add fruit as show below:
