0

In FruitAdmin():, I overrode response_change() with the code to capitalize the name which a user inputs on Change fruit 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): # Here
        obj.name = obj.name.upper()
        obj.save()
        return super().response_change(request, obj)

Then, I input orange to Name: on Change fruit as shown below:

enter image description here

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

enter image description here

But according to PostgreSQL logs, there is a useless UPDATE query as shown below. *I use PostgreSQL and you can check On PostgreSQL, how to log queries with transaction queries such as "BEGIN" and "COMMIT":

enter image description here

So, how can I remove the useless UPDATE query as shown above?

Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129

1 Answers1

0

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:

enter image description here

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

enter image description here

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

enter image description here

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:

enter image description here

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:

enter image description here

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

enter image description here

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:

enter image description here

Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129