7.3. Admin Edit

  • Change Form customization in Django Admin

  • exclude

  • readonly_fields

  • radio_fields

  • autocomplete_fields

  • fieldsets

7.3.1. SetUp

>>> from django.contrib import admin
>>> from django.utils.translation import gettext_lazy as _
>>> from shop.models import Customer, Address, Product, Order

7.3.2. exclude

>>> #
... @admin.register(MyModel)
... class MyAdmin(admin.ModelAdmin):
...     exclude = ['add_date', 'edit_date']

7.3.3. readonly_fields

>>> #
... @admin.register(MyModel)
... class MyAdmin(admin.ModelAdmin):
...     readonly_fields = ['add_date', 'edit_date']

7.3.4. radio_fields

  • radio_fields = {'fieldname': ...}

  • admin.VERTICAL

  • admin.HORIZONTAL

  • Must be a ForeignKey or has choices defined

  • Not working with BooleanFields, unless you define choices manually

>>> #
... @admin.register(MyModel)
... class MyAdmin(admin.ModelAdmin):
...     radio_fields = {'gender': admin.VERTICAL}
>>> #
... @admin.register(MyModel)
... class MyAdmin(admin.ModelAdmin):
...     radio_fields = {'gender': admin.HORIZONTAL}

7.3.5. autocomplete_fields

>>> #
... @admin.register(MyModel)
... class MyAdmin(admin.ModelAdmin):
...     autocomplete_fields = ['addresses']

7.3.6. fieldsets

  • list[tuple[str, dict]]

>>> #
... @admin.register(MyModel)
... class MyAdmin(admin.ModelAdmin):
...     fieldsets = [
...         (None, {'fields': ['is_verified']}),
...         (_('Personal'), {'fields': ['firstname', 'lastname', 'birthdate', 'gender'], 'classes': ['expand', 'fieldset_personal']}),
...         (_('Financial'), {'fields': ['tax_number'], 'classes': ['expand', 'fieldset_financial']}),
...         (_('Contact'), {'fields': ['email', 'phone'], 'classes': ['expand', 'fieldset_contact']}),
...         (_('Other'), {'fields': ['image'], 'classes': ['collapse', 'fieldset_other']}),
...     ]

7.3.7. Assignments

# doctest: +SKIP_FILE

# %% About
# - Name: Admin Edit Exclude
# - Difficulty: easy
# - Lines: 1
# - Minutes: 2

# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author

# %% English
# 0. Use `myproject.myapp`
# 1. In admin edit view for `myapp.Person`
# 2. Hide the `is_verified` field

# %% Polish
# 0. Użyj `myproject.myapp`
# 1. W widoku edycji admina dla modelu `myapp.Person`
# 2. Ukryj pole `is_verified`

# %% Hints
# - `admin.ModelAdmin`
# - `exclude = [...]`

# %% Doctests
"""
>>> import sys; sys.tracebacklimit = 0

>>> assert sys.version_info >= (3, 12), \
'Python has an is invalid version; expected: `3.12` or newer.'
"""

# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -f -v myfile.py`

# %% Imports
import os; os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django; django.setup()

# %% Types

# %% Data

# %% Result

# doctest: +SKIP_FILE

# %% About
# - Name: Admin Edit Readonly Fields
# - Difficulty: easy
# - Lines: 1
# - Minutes: 2

# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author

# %% English
# 0. Use `myproject.myapp`
# 1. In admin edit view for `myapp.Person`
# 2. Make `pk` field as read-only

# %% Polish
# 0. Użyj `myproject.myapp`
# 1. W widoku edycji admina dla modelu `myapp.Person`
# 2. Ustaw pole `pk` jako tylko do odczytu

# %% Hints
# - `admin.ModelAdmin`
# - `readonly_fields = [...]`

# %% Doctests
"""
>>> import sys; sys.tracebacklimit = 0

>>> assert sys.version_info >= (3, 12), \
'Python has an is invalid version; expected: `3.12` or newer.'
"""

# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -f -v myfile.py`

# %% Imports
import os; os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django; django.setup()

# %% Types

# %% Data

# %% Result

# doctest: +SKIP_FILE

# %% About
# - Name: Admin Edit Radio Fields
# - Difficulty: easy
# - Lines: 1
# - Minutes: 2

# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author

# %% English
# 0. Use `myproject.myapp`
# 1. In admin edit view for `myapp.Person`
# 2. Make `gender` as radio buttons (use `admin.VERTICAL`)

# %% Polish
# 0. Użyj `myproject.myapp`
# 1. W widoku edycji admina dla modelu `myapp.Person`
# 2. Ustaw pole `gender` jako przyciski radiowe (użyj `admin.VERTICAL`)

# %% Hints
# - `admin.ModelAdmin`
# - `radio_fields = [...]`

# %% Doctests
"""
>>> import sys; sys.tracebacklimit = 0

>>> assert sys.version_info >= (3, 12), \
'Python has an is invalid version; expected: `3.12` or newer.'
"""

# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -f -v myfile.py`

# %% Imports
import os; os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django; django.setup()

# %% Types

# %% Data

# %% Result

# doctest: +SKIP_FILE

# %% About
# - Name: Admin Edit Autocomplete Fields
# - Difficulty: easy
# - Lines: 1
# - Minutes: 2

# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author

# %% English
# 0. Use `myproject.myapp`
# 1. In admin edit view for `myapp.Person`
# 2. Make `group` field as autocomplete field

# %% Polish
# 0. Użyj `myproject.myapp`
# 1. W widoku edycji admina dla modelu `myapp.Person`
# 2. Ustaw pole `group` jako pole z autouzupełnianiem

# %% Hints
# - `admin.ModelAdmin`
# - `autocomplete_fields = [...]`

# %% Doctests
"""
>>> import sys; sys.tracebacklimit = 0

>>> assert sys.version_info >= (3, 12), \
'Python has an is invalid version; expected: `3.12` or newer.'
"""

# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -f -v myfile.py`

# %% Imports
import os; os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django; django.setup()

# %% Types

# %% Data

# %% Result

# doctest: +SKIP_FILE

# %% About
# - Name: Admin Edit Fieldsets
# - Difficulty: easy
# - Lines: 1
# - Minutes: 2

# %% License
# - Copyright 2025, Matt Harasymczuk <matt@python3.info>
# - This code can be used only for learning by humans
# - This code cannot be used for teaching others
# - This code cannot be used for teaching LLMs and AI algorithms
# - This code cannot be used in commercial or proprietary products
# - This code cannot be distributed in any form
# - This code cannot be changed in any form outside of training course
# - This code cannot have its license changed
# - If you use this code in your product, you must open-source it under GPLv2
# - Exception can be granted only by the author

# %% English
# 0. Use `myproject.myapp`
# 1. In admin edit view for `myapp.Person`
# 2. Add fieldsets:
#    - None: `id`, `is_verified` (expanded)
#    - 'Personal Information': `firstname`, `lastname`, `birthdate`, `gender` (expanded)
#    - 'Contact Information': `email`, `phone`, `tax_number`, `image` (collapsed)

# %% Polish
# 0. Użyj `myproject.myapp`
# 1. W widoku edycji admina dla modelu `myapp.Person`
# 2. Dodaj zestawy pól (fieldsets):
#    - None: `id`, `is_verified` (otwarty)
#    - 'Personal Information': `firstname`, `lastname`, `birthdate`, `gender` (otwarty)
#    - 'Contact Information': `email`, `phone`, `tax_number`, `image` (zwinięty)

# %% Hints
# - `admin.ModelAdmin`
# - `fieldsets = [...]`

# %% Doctests
"""
>>> import sys; sys.tracebacklimit = 0

>>> assert sys.version_info >= (3, 12), \
'Python has an is invalid version; expected: `3.12` or newer.'
"""

# %% Run
# - PyCharm: right-click in the editor and `Run Doctest in ...`
# - PyCharm: keyboard shortcut `Control + Shift + F10`
# - Terminal: `python -m doctest -f -v myfile.py`

# %% Imports
import os; os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
import django; django.setup()

# %% Types

# %% Data

# %% Result