Saltar a contenido

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$):

python3 manage.py createsuperuser

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)