Django admin
Django provides a default admin interface
, that provides a convenient interface to manage model
data and visualize database
.
It can be used to perform create, read, update and delete (CURD
) operations on the model directly.
Features of Django Admin
Automatic CRUD Operations: The admin interface allows you to Create, Read, Update, and Delete (CRUD) records in your application’s database without writing additional code.
User Authentication: Django’s admin interface provides a robust authentication system, ensuring that only authorized users can access the admin panel.
Data Validation: It enforces data validation rules defined in your models, ensuring data integrity.
Customizable: While it starts with sensible default settings, you can extensively customize the admin interface to match your application’s requirements.
3.1 Activating and Using the Admin Interface
- Add app in
INSTALLED_APPS
- And create
Superuser
# Create superuser
python manage.py createsuperuser
# Enter --> email, username, password
# After create
python manage.py runserver
- Visit localhost/admin
- Login using username and password
3.2 Register models in admin-panel
Only after registration model is visible in admin-panel
3 Ways for Registration
from customer.models import Customer
# Way 1
admin.site.register(Customer)
# Way 2
@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
pass
# Way 3
class CustomerAdmin(admin.ModelAdmin):
pass
admin.site.register(Customer, CustomerAdmin)
3.3 Basic: Model display
# Attribute becomes link (clickable) on 'add page'
list_display_links = ()
# Limit no of items per page in admin panel
list_per_page = 25
# Add search instead of select --> for ForeignKey
raw_id_fields = ()
# Gets all the fields name
all_fields_name = [f.name for f in Adhar._meta.fields]
Sample
from django.contrib import admin
from customer.models import Customer
@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
# ---> Display data - in Table Page
list_display = ('f_name', 'get_is_active', 'mobile_is_verified', 'user')
search_fields = ('=user__first_name',)
list_editable = ('mobile_is_verified', )
actions = ['mark_mobile_verified']
# list_display_links = ('user', )
list_filter = ('mobile_is_verified', 'email_is_verified')
# Handle FK
def get_is_active(self, obj):
return obj.user.is_active
# Apply a function
def mark_mobile_verified(self, request, queryset):
queryset.update(mobile_is_verified=True)
mark_mobile_verified.short_description = 'Mark Ph no as Verified'
# ---> Display data - of Each Row
readonly_fields = ('email_id', 'mobile')
exclude = ('lead_status', )
# Grouping of fields - and fields that want to show
# fields = (('f_name', 'l_name'), 'is_active')
3.4 Advance: Model display
https://docs.djangoproject.com/en/3.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin.fieldsets
- fieldsets = ()
- format (name, field_options),
- name –> the title of the fieldset
- field_options –> dictionary of information about the fieldset,
- including a list of fields to be displayed in it.
- collapse and wide –> are widely used classes
- description –> About fields
fieldsets = (
(name, {
'description': 'info about the fields'
'classes': ('collapse',),
'fields': ('field1', 'field2')
}),
)
Sample
from django.contrib import admin
from customer.models import Customer
@admin.register(Customer)
class CustomerAdmin(admin.ModelAdmin):
# ---> Display data - of Each Row
# Grouping Using Fieldsets
fieldsets = (
(None, {
'fields': ('user', ('f_name', 'l_name'), 'mobile')
}),
('Advanced options', {
'classes': ('collapse',),
'fields': ('create_datetime', 'campaign_ids'),
}),
)
3.5 InlineModelAdmin objects
Display two or more MODELS
at the same admin-panel page- The admin interface has the ability to edit models on the same page as a parent model.
- For different model-types has different ways of doing:
- two or more foreign keys
- many-to-many models
- many-to-many intermediary models
- Django provides two subclasses of InlineModelAdmin and they are:
TabularInline
StackedInline
TabularInline
https://docs.djangoproject.com/en/4.1/ref/contrib/admin/#working-with-many-to-many-models
class UserPermissionInline(admin.TabularInline):
model = User.user_permissions.through
class GroupInline(admin.TabularInline):
model = User.groups.through
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ('username', 'email', 'is_staff', 'is_superuser')
exclude = ('user_permissions', 'groups')
inlines = [
UserPermissionInline,
GroupInline
]
3.6 Changes in Admin panel (Logo, CSS)
admin.site.site_header = 'Kharchapani Admin panel'
- Changing the title of Django Admin, By default, this is “Django administration”
{% extends 'admin/base.html' %}
{% load static %}
<!-- TO Edit LOGO/Branding -->
{% block branding %}
<h1 id="head">
<img src="{% static 'img/logo.png' %}" alt="BT Real Estate"
height="50" width="80" class="brand_img"> Admin Area
</h1>
{% endblock %}
<!-- To edit CSS -->
{% block extrastyle %}
<link rel="stylesheet" href="{% static 'css/admin.css' %}">
{% endblock %}
dada
The ‘prepopulated_fields’ attribute in a Django admin model admin class is used to specify fields that will be prepopulated based on the value of other fields. It automatically fills in the specified fields based on other field values, such as slugs or concatenated values.
Reference
- Doc: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/
- Doc: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#admin-overriding-templates
- Github: https://github.com/django/django/blob/main/django/contrib/admin/templates/admin/base_site.html
- Django Admin Cookbook: https://books.agiliq.com/projects/django-admin-cookbook/en/latest/index.html
- https://simpleisbetterthancomplex.com/tutorial/2017/03/14/how-to-create-django-admin-list-actions.html