Administración de Modelos
El marco Django viene con un sistema de administración incorporado para sus modelos de datos. Con muy poco esfuerzo, puede configurar listas que se pueden filtrar, buscar y clasificar para explorar sus modelos, y puede configurar formularios para agregar y administrar datos
Requisitos Previos
Primero verificar que en el archivo sitealmacen/sitealmacen/settings.py dentro de INSTALLED_APPS, se encuentre la librería 'django.contrib.admin',
Crear Super Usuario:
En la terminal de VS Code, en la carpeta de aplicación y recordar tener activa el ambiente virtual del proyecto ((.venv) ubuntu@PortatlJQ:~/appsweb/clasesdlloweb/backdjango/2022iisem/sitealmacen$):
Una vez ingresado esto en la terminal solicitaría:
Nombre de usuario (leave blank to use 'ubuntu'): administrador
Dirección de correo electrónico: admin\@gmail.com
Password:
Password (again):
Esta contraseña es demasiado común.
Esta contraseña es completamente numérica.
Bypass password validation and create user anyway? [y/N]: y
Responder a cada interrogante
Registrando los Modelos
Primero se registra en cada Aplicación (Clientes, Productos y Ventas) en el archivo admin.py de cada aplicación, es decir:
myapps/client/admin.py
myapps``/product/admin.py
myapps``/sale/admin.py
Registrando el Modelo Client
myapps``/client/admin.py
from django.contrib import admin
from myapps.client.models import Client
# Register your models here.
class ClientAdmin(admin.ModelAdmin):
pass
admin.site.register(Client, ClientAdmin)
Registrando el Modelo Product
myapps``/product/admin.py
from django.contrib import admin
from myapps.product.models import Product, ProductType
# Register your models here.
class ProductAdmin(admin.ModelAdmin):
pass
admin.site.register(ProductType)
admin.site.register(Product, ProductAdmin)
Registrando el Modelo Sale
myapps``/sale/admin.py
from django.contrib import admin
from myapps.sale.models import Sale, ProductSale
# Register your models here.
class ProductSaleInline(admin.TabularInline):
model = ProductSale
extra = 1
class ProductAdmin(admin.ModelAdmin):
inlines = (ProductSaleInline,)
class SaleAdmin(admin.ModelAdmin):
inlines = (ProductSaleInline,)
admin.site.register(Sale, SaleAdmin)
Personalizar Administración de Clientes
myapps/client/admin.py
from django.contrib import admin
from myapps.client.models import Client
# Register your models here.
class ClientAdmin(admin.ModelAdmin):
list_display = ('name', 'email', 'phone', 'address')
list_filter = ('name', 'email', 'phone', 'address',)
search_fields = ('name', 'email', 'phone', 'address')
ordering = ('name', 'email',)
fieldsets = (
('Información Personal', {
'fields': ('name', 'email', 'phone', 'address')
}),
('Credenciales', {
'fields': ('password',),
'classes': ('collapse',)
}),
('Estado', {
'fields': ('status',)
}),
)
# Solo mostrar campos de solo lectura para el password en el formulario de cambio
readonly_fields = ()
# def get_readonly_fields(self, request, obj=None):
# if obj: # Editando un cliente existente
# return ('email',) # Email no editable una vez creado por la constraint unique
# return ()
admin.site.register(Client, ClientAdmin)

Personalizar Administración de Productos
myapps/product/admin.py
from django.contrib import admin
from myapps.product.models import Product, ProductType
# Admin para ProductType
class ProductTypeAdmin(admin.ModelAdmin):
list_display = ('name', 'status', 'id')
list_filter = ('status',)
search_fields = ('name',)
list_editable = ('status',)
ordering = ('name',)
fieldsets = (
(None, {
'fields': ('name', 'description', 'status')
}),
)
# Admin para Product
class ProductAdmin(admin.ModelAdmin):
list_display = ('name', 'brand', 'price', 'quantity', 'min_stock', 'product_type', 'status')
list_filter = ('status', 'product_type', 'brand')
search_fields = ('name', 'brand')
list_editable = ('status', 'price', 'quantity')
ordering = ('name',)
fieldsets = (
('Información Básica', {
'fields': ('name', 'brand', 'product_type')
}),
('Precio y Stock', {
'fields': ('price', 'quantity', 'min_stock')
}),
('Estado', {
'fields': ('status',)
}),
)
# Filtros en la barra lateral
def get_queryset(self, request):
return super().get_queryset(request).select_related('product_type')
admin.site.register(ProductType, ProductTypeAdmin)
admin.site.register(Product, ProductAdmin)


Personalizar Administración de Ventas
myapps/sale/admin.py
from django.contrib import admin
from myapps.sale.models import Sale, ProductSale
# Inline para ProductSale
class ProductSaleInline(admin.TabularInline):
model = ProductSale
extra = 1
fields = ('product', 'total')
autocomplete_fields = ['product'] # Para mejorar la selección de productos
def get_extra(self, request, obj=None, **kwargs):
# Si es una nueva venta, mostrar 3 líneas vacías
if obj is None:
return 3
# Si es una venta existente, mostrar solo 1 línea extra
return 1
# Admin para Sale
class SaleAdmin(admin.ModelAdmin):
list_display = ('id', 'client', 'sale_date', 'subtotal', 'tax', 'discounts', 'total', 'status')
list_filter = ('status', 'sale_date', 'client')
search_fields = ('client__name', 'client__email')
list_editable = ('status',)
ordering = ('-sale_date',)
date_hierarchy = 'sale_date'
fieldsets = (
('Información de la Venta', {
'fields': ('client', 'status')
}),
('Totales', {
'fields': ('subtotal', 'tax', 'discounts', 'total'),
'classes': ('collapse',)
}),
('Fecha', {
'fields': ('sale_date',),
'classes': ('collapse',)
}),
)
readonly_fields = ('sale_date',)
inlines = (ProductSaleInline,)
def get_queryset(self, request):
return super().get_queryset(request).select_related('client')
# Autocomplete para el campo client
autocomplete_fields = ['client']
# Admin para ProductSale (opcional, por si se quiere administrar directamente)
class ProductSaleAdmin(admin.ModelAdmin):
list_display = ('sale', 'product', 'total')
list_filter = ('sale__status', 'product__status', 'sale__sale_date')
search_fields = ('sale__client__name', 'product__name', 'product__brand')
ordering = ('-sale__sale_date',)
def get_queryset(self, request):
return super().get_queryset(request).select_related('sale', 'product', 'sale__client')
admin.site.register(Sale, SaleAdmin)
admin.site.register(ProductSale, ProductSaleAdmin)

