feat: add subcategory support for catalog and admin
All checks were successful
Build and Push Docker Image / build (push) Successful in 30s

- Introduced `Subcategory` model with migration and unique slug constraint per category
- Enabled subcategory assignment for items with validation to ensure category matching
- Updated catalog views to handle subcategories, filtering items accordingly
- Enhanced templates (`index.html`, `side-bar.html`, `item-list.html`, `detail.html`) to display subcategories
- Added dynamic subcategory dropdown in Django admin with category filtering
- Created JavaScript for admin subcategory handling and AJAX population
- Wrote comprehensive tests for subcategory functionality in views and admin
This commit is contained in:
2026-04-26 22:53:45 +02:00
parent bb321dfa22
commit 27187c5e53
10 changed files with 366 additions and 12 deletions

View File

@@ -0,0 +1,37 @@
# Generated by Django 6.0.4 on 2026-04-26 20:49
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('items', '0002_itemimage'),
]
operations = [
migrations.CreateModel(
name='Subcategory',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Название')),
('slug', models.SlugField(verbose_name='URL')),
('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subcategories', to='items.category', verbose_name='Категория')),
],
options={
'verbose_name': 'Подкатегория',
'verbose_name_plural': 'Подкатегории',
'ordering': ('category__name', 'name'),
},
),
migrations.AddField(
model_name='item',
name='subcategory',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='items', to='items.subcategory', verbose_name='Подкатегория'),
),
migrations.AddConstraint(
model_name='subcategory',
constraint=models.UniqueConstraint(fields=('category', 'slug'), name='unique_subcategory_slug_per_category'),
),
]