Django, дополнительные поля по категориям товаров
Помогите пожалуйста. Я пытаюсь написать интернет-магазин на Django. Хочу, чтобы в зависимости от категории товара появлялись дополнительные поля характеристик товара. Например: если в админ панели при создании карточки товара выбрать категорию "кофе", то появится блок с дополнительными полями: processing_method, geography, special, sour, roasting. Если выбрать категорию "чай" - появляются другие дополнительные поля. Пробовал использовать fieldsets в admin.py - понял, что этот вариант не подходит. Остановился на создании поля в models.py - characteristics = models.JSONField(), почитал документацию и не понял, как реализовать мой случай. Смысл идей в динамическом формировании карточки (дополнительные поля) при выборе категории Буду рад любой ссылке с похожим примером или решением похожей проблемы или подсказке о правильном пути решения данной проблемы.
models.py
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=100, db_index=True)
slug = models.SlugField(max_length=100, db_index=True, unique=True)
class Meta:
ordering = ('name',)
verbose_name = 'category'
verbose_name_plural = 'categories'
def __str__(self):
return self.name
class Product(models.Model):
ROASTING_CHOICES = (
(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)
)
SOUR_CHOICES = (
('low', 'low'), ('medium', 'medium'), ('high', 'high')
)
VIEW_COFFEE_CHOICES = (
('arabica', 'arabica'), ('robusta', 'robusta'), ('arabica_blend', 'arabica_blend'),
('arabica_robusta', 'arabica_robusta')
)
VIEW_COFFEE_CHOICES = (
('popular', 'popular'), ('new_crop', 'new_crop'), ('your_choice', 'your_choice'),
('micro_lot', 'micro_lot'), ('sort_week', 'sort_week'), ('discounts', 'discounts'), ('new', 'new')
)
PROCESSING_METHOD_CHOICES = (
('dry', 'dry'), ('washed', 'washed'), ('other', 'other')
)
category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
name = models.CharField(max_length=200, db_index=True)
slug = models.SlugField(max_length=200, db_index=True)
title = models.CharField(max_length=200, default='some_product')
image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
description = models.TextField(blank=True)
characteristics = models.JSONField()
price = models.DecimalField(max_digits=10, decimal_places=2)
discount = models.DecimalField(max_digits=2, decimal_places=0, blank=True)
stock = models.PositiveIntegerField()
available = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
class Meta:
ordering = ('name', 'category')
index_together = (('id', 'slug'),)
def __str__(self):
return self.name
==========================================================
Дополнительные поля, которые я хотел бы добавить в категорию "кофе":
roasting = models.PositiveIntegerField(default=0, blank=True, choices=ROASTING_CHOICES)
sour = models.CharField(max_length=30, blank=True, choices=SOUR_CHOICES)
view = models.CharField(max_length=30, blank=True, choices=VIEW_COFFEE_CHOICES)
special = models.CharField(max_length=30, blank=True, choices=VIEW_COFFEE_CHOICES)
processing_method = models.CharField(max_length=30, blank=True, choices=VIEW_COFFEE_CHOICES)
geography = models.CharField(max_length=50, blank=True)
===========================================================
admin.py
from django.contrib import admin
from .models import Category, Product
class CategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'slug']
prepopulated_fields = {'slug': ('name',)}
admin.site.register(Category, CategoryAdmin)
class ProductAdmin(admin.ModelAdmin):
search_fields = ("name__startswith",)
list_display = ['name', 'slug', 'category', 'price', 'stock', 'available', 'created', 'updated']
list_filter = ['category', 'available', 'created', 'updated']
list_editable = ['price', 'stock', 'available']
prepopulated_fields = {'slug': ('name',)}
admin.site.register(Product, ProductAdmin)