from django import forms from django.contrib import admin from django.http import JsonResponse from django.urls import path from .models import Category, Color, Item, ItemImage, Subcategory def get_subcategory_queryset(category_id): if not category_id: return Subcategory.objects.none() try: category_id = int(category_id) except (TypeError, ValueError): return Subcategory.objects.none() return Subcategory.objects.filter(category_id=category_id).order_by('name') @admin.register(Color) class ColorAdmin(admin.ModelAdmin): list_display = ('name', 'hex_code') @admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display = ('name', 'slug') prepopulated_fields = {'slug': ('name',)} @admin.register(Subcategory) class SubcategoryAdmin(admin.ModelAdmin): list_display = ('name', 'category', 'slug') list_filter = ('category',) prepopulated_fields = {'slug': ('name',)} class ItemAdminForm(forms.ModelForm): class Meta: model = Item fields = '__all__' def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) category_id = self.data.get('category') or getattr(self.instance, 'category_id', None) self.fields['subcategory'].queryset = get_subcategory_queryset(category_id) class ItemImageInline(admin.TabularInline): model = ItemImage extra = 1 fields = ('image', 'alt', 'sort_order', 'is_primary') @admin.register(Item) class ItemAdmin(admin.ModelAdmin): form = ItemAdminForm save_as = True list_display = ('name', 'category', 'subcategory', 'price', 'discount_price', 'is_new', 'is_available', 'created_at') list_filter = ('is_available', 'is_new', 'colors', 'category', 'subcategory', 'created_at') filter_horizontal = ('colors',) prepopulated_fields = {'slug': ('name',)} inlines = (ItemImageInline,) class Media: js = ('items/admin/item-subcategory.js',) def get_urls(self): urls = super().get_urls() custom_urls = [ path( 'subcategories/', self.admin_site.admin_view(self.subcategories_view), name='items_item_subcategories', ), ] return custom_urls + urls def subcategories_view(self, request): category_id = request.GET.get('category_id') subcategories = get_subcategory_queryset(category_id) return JsonResponse({ 'subcategories': [ {'id': subcategory.id, 'name': subcategory.name} for subcategory in subcategories ], })