• About Us
  • Privacy Policy
  • Disclaimer
  • Contact Us
AimactGrow
  • Home
  • Technology
  • AI
  • SEO
  • Coding
  • Gaming
  • Cybersecurity
  • Digital marketing
No Result
View All Result
  • Home
  • Technology
  • AI
  • SEO
  • Coding
  • Gaming
  • Cybersecurity
  • Digital marketing
No Result
View All Result
AimactGrow
No Result
View All Result

Tips on how to Construct a Django-Unfold Admin Dashboard with Customized Fashions, Filters, Actions, and KPIs

Admin by Admin
May 15, 2026
Home AI
Share on FacebookShare on Twitter


(ROOT / "store" / "admin.py").write_text('''
from django.contrib import admin, messages
from django.contrib.auth.admin import (UserAdmin as DjangoUserAdmin,
                                      GroupAdmin as DjangoGroupAdmin)
from django.contrib.auth.fashions import Person, Group
from django.shortcuts import redirect
from django.utils.html import format_html
from django.utils.translation import gettext_lazy as _
from unfold.admin import ModelAdmin, TabularInline
from unfold.contrib.filters.admin import (
   ChoicesDropdownFilter, RangeNumericFilter, RangeDateFilter,
   MultipleChoicesDropdownFilter,
)
from unfold.decorators import show, motion
from .fashions import Class, Buyer, Product, Order, OrderItem
admin.web site.unregister(Person); admin.web site.unregister(Group)
@admin.register(Person)
class UserAdmin(DjangoUserAdmin, ModelAdmin):
   move
@admin.register(Group)
class GroupAdmin(DjangoGroupAdmin, ModelAdmin):
   move
@admin.register(Class)
class CategoryAdmin(ModelAdmin):
   list_display = ("identify", "father or mother", "show_active", "created_at")
   list_filter  = (("is_active", ChoicesDropdownFilter),)
   search_fields = ("identify", "slug")
   prepopulated_fields = {"slug": ("identify",)}
   list_filter_submit = True
   compressed_fields = True
   @show(description=_("Lively"), boolean=True)
   def show_active(self, obj): return obj.is_active
@admin.register(Buyer)
class CustomerAdmin(ModelAdmin):
   list_display = ("identify","e mail","show_tier","lifetime_value","joined")
   list_filter  = (
       ("tier",            MultipleChoicesDropdownFilter),
       ("lifetime_value",  RangeNumericFilter),
       ("joined",          RangeDateFilter),
   )
   search_fields = ("identify","e mail")
   list_filter_submit = True
   warn_unsaved_form  = True
   list_per_page = 25
   @show(description=_("Tier"), label={
       "bronze":"warning","silver":"information","gold":"success","platinum":"major"})
   def show_tier(self, obj):
       return obj.get_tier_display(), obj.tier
class OrderItemInline(TabularInline):
   mannequin = OrderItem
   further = 0
   fields = ("product", "amount", "unit_price", "place")
   ordering_field = "place"
   tab = True
@admin.register(Order)
class OrderAdmin(ModelAdmin):
   list_display = ("quantity","customer_link","show_status","whole","created_at")
   list_filter  = (
       ("standing",     ChoicesDropdownFilter),
       ("whole",      RangeNumericFilter),
       ("created_at", RangeDateFilter),
   )
   search_fields = ("quantity","customer__name","customer__email")
   readonly_fields = ("created_at",)
   autocomplete_fields = ("buyer",)
   inlines = [OrderItemInline]
   list_filter_submit = True
   fieldsets = (
       (_("Order"), {"lessons":["tab"], "fields":("quantity","buyer","standing","whole")}),
       (_("Notes"), {"lessons":["tab"], "fields":("notes","created_at")}),
   )
   actions_list        = ["mark_paid_bulk"]
   actions_row         = ["mark_paid_row"]
   actions_detail      = ["duplicate_order"]
   actions_submit_line = ["save_and_ship"]
   @show(description=_("Standing"), label={
       "pending":"warning","paid":"information","shipped":"major",
       "delivered":"success","cancelled":"hazard"})
   def show_status(self, obj):
       return obj.get_status_display(), obj.standing
   @show(description=_("Buyer"))
   def customer_link(self, obj):
       return format_html('{}',
                          obj.customer_id, obj.buyer.identify)
   @motion(description=_("Mark pending → PAID (all)"), icon="funds")
   def mark_paid_bulk(self, request, queryset=None):
       n = Order.objects.filter(standing="pending").replace(standing="paid")
       self.message_user(request, f"Marked {n} orders as paid.", degree=messages.SUCCESS)
   @motion(description=_("Mark paid"), icon="funds", url_path="mark-paid-row")
   def mark_paid_row(self, request, object_id):
       Order.objects.filter(pk=object_id).replace(standing="paid")
       self.message_user(request, "Order marked as paid.", degree=messages.SUCCESS)
       return redirect(request.META.get("HTTP_REFERER","/admin/"))
   @motion(description=_("Duplicate"), icon="content_copy", url_path="duplicate")
   def duplicate_order(self, request, object_id):
       o = Order.objects.get(pk=object_id)
       o.pk = None; o.quantity = o.quantity + "-COPY"; o.standing = "pending"; o.save()
       self.message_user(request, "Order duplicated.", degree=messages.SUCCESS)
       return redirect(f"/admin/store/order/{o.pk}/change/")
   @motion(description=_("Save & ship"))
   def save_and_ship(self, request, obj):
       obj.standing = "shipped"; obj.save()
       self.message_user(request, f"Order {obj.quantity} shipped.", degree=messages.SUCCESS)
@admin.register(Product)
class ProductAdmin(ModelAdmin):
   list_display = ("identify","sku","class","show_status",
                   "price_display","stock_badge","featured")
   list_editable = ("featured",)
   list_filter   = (
       ("standing",   ChoicesDropdownFilter),
       ("class", admin.RelatedFieldListFilter),
       ("worth",    RangeNumericFilter),
       ("featured", ChoicesDropdownFilter),
   )
   search_fields = ("identify","sku")
   autocomplete_fields = ("class",)
   list_filter_submit = True
   list_per_page = 20
   save_on_top = True
   fieldsets = (
       (_("Fundamentals"),  {"lessons":["tab"],
                       "fields":("identify","sku","class","standing","featured")}),
       (_("Pricing"), {"lessons":["tab"],
                       "fields":("worth","has_discount","discount_percent","inventory")}),
       (_("Content material"), {"lessons":["tab"], "fields":("description",)}),
   )
   conditional_fields = {"discount_percent": "has_discount == true"}
   @show(description=_("Standing"), label={
       "draft":"information","lively":"success","archived":"warning"})
   def show_status(self, obj):
       return obj.get_status_display(), obj.standing
   @show(description=_("Value"))
   def price_display(self, obj):
       if obj.has_discount and obj.discount_percent:
           return format_html(
               '${} '
               '${}', obj.worth, obj.final_price)
       return f"${obj.worth}"
   @show(description=_("Inventory"), ordering="inventory",
            label={"out":"hazard","low":"warning","okay":"success"})
   def stock_badge(self, obj):
       if obj.inventory == 0:                  return "Out of inventory", "out"
       if obj.inventory < 10:                  return f"Low ({obj.inventory})", "low"
       return f"{obj.inventory} in inventory", "okay"
''')
(ROOT / "templates" / "admin" / "index.html").write_text('''{% extends "admin/index.html" %}
{% load i18n %}
{% block content material %}
{% for ok in kpis %}

{{ ok.title }}

{{ ok.worth }}

{{ ok.footer }}

{% endfor %}

{% trans "High classes" %}

    {% for c in top_cats %}
  • {{ c.identify }}{{ c.n }}
  • {% endfor %}

{% trans "Orders by standing" %}

    {% for s in by_status %}
  • {{ s.standing }}{{ s.c }}
  • {% endfor %}
{{ block.tremendous }} {% endblock %} ''')
Tags: actionsadminBuildCustomDashboardDjangoUnfoldfiltersKPIsModels
Admin

Admin

Next Post
NAND contract costs surge over 600% since September 2025, DRAM up ~400%

NAND contract costs surge over 600% since September 2025, DRAM up ~400%

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recommended.

Tech Billionaires Already Captured the White Home. They Nonetheless Need to Be Kings

Tech Billionaires Already Captured the White Home. They Nonetheless Need to Be Kings

September 26, 2025
Native Nepalese media stories that 19+ folks have been killed after police opened fireplace on “Gen Z protests” in opposition to a authorities ban on main social media platforms (Andres Schipani/Monetary Occasions)

Swift says it’s constructing a blockchain-based ledger with over 30 monetary establishments and the primary prototype can be in-built partnership with Consensys (Bloomberg)

September 29, 2025

Trending.

Nsfw Chatgpt Options – Examples I’ve Used

Nsfw Chatgpt Options – Examples I’ve Used

October 13, 2025
Digital Detox & Display Time Statistics 2025

Digital Detox & Display Time Statistics 2025

March 28, 2026
How creators and entrepreneurs are utilizing AI to hurry up & succeed [data]

How creators and entrepreneurs are utilizing AI to hurry up & succeed [data]

June 17, 2025
ModeloRAT and Mistic Backdoor Exercise Linked to Ransomware Preliminary Entry Dealer

ModeloRAT and Mistic Backdoor Exercise Linked to Ransomware Preliminary Entry Dealer

June 24, 2026
Cisco Catalyst SD-WAN Zero-Day CVE-2026-20245 Exploited to Acquire Root Entry

Cisco Catalyst SD-WAN Zero-Day CVE-2026-20245 Exploited to Acquire Root Entry

June 25, 2026

AimactGrow

Welcome to AimactGrow, your ultimate source for all things technology! Our mission is to provide insightful, up-to-date content on the latest advancements in technology, coding, gaming, digital marketing, SEO, cybersecurity, and artificial intelligence (AI).

Categories

  • AI
  • Coding
  • Cybersecurity
  • Digital marketing
  • Gaming
  • SEO
  • Technology

Recent News

Marketing campaign optimization methods that really work in 2026

Marketing campaign optimization methods that really work in 2026

June 30, 2026
WhatsApp to let individuals chat with usernames – methods to reserve one

WhatsApp to let individuals chat with usernames – methods to reserve one

June 30, 2026
  • About Us
  • Privacy Policy
  • Disclaimer
  • Contact Us

© 2025 https://blog.aimactgrow.com/ - All Rights Reserved

No Result
View All Result
  • Home
  • Technology
  • AI
  • SEO
  • Coding
  • Gaming
  • Cybersecurity
  • Digital marketing

© 2025 https://blog.aimactgrow.com/ - All Rights Reserved