Django Подскажите как настроить вариацию товаров
Подскажите как сделать чтобы можно было отдельно добавить возможность выбора Вариации из Tag и после выбрать нужные Variety в Product
#*******************************
#*******************************
#model.py
#*******************************
#*******************************
class Variety(models.Model):
varietyName = models.CharField(max_length=30)
def __str__(self):
return self.varietyName
class Meta:
verbose_name = "Список вариации"
verbose_name_plural = "Список вариаций"
class Tag(models.Model):
STATUS_VARIETY=(
('Filters', 'ФИЛЬТР'),
('Variaty', 'Вариация'),
('Boths', 'Оба'),
)
status = models.CharField(max_length=10, choices=STATUS_VARIETY, default='Boths', verbose_name='Статус')
name = models.CharField(max_length=255, verbose_name='Название')
variety = models.ManyToManyField(Variety, related_name='children', verbose_name='Родитель')
def __str__(self):
return self.name
class Meta:
verbose_name = "Вариация"
verbose_name_plural = "Вариации"
class Productcopy(models.Model):
STATUS_PRODUCT=(
('Publish', 'Опубликовать'),
('Not_to_publish', 'Не публиковать'),
)
status = models.CharField(max_length=30, choices=STATUS_PRODUCT, verbose_name='Статус')
name = models.CharField(max_length=100, verbose_name='Название')
tag = models.ForeignKey(Tag, verbose_name='Вариация', on_delete=models.CASCADE)
variety = models.ManyToManyField(Variety, verbose_name='вариации')
def __str__(self):
return self.name
class Meta:
verbose_name = "товары"
verbose_name_plural = "товары"
#*******************************
#*******************************
#admin.py
#*******************************
#*******************************
from django.contrib import admin
from .models import *
class TagAdmin(admin.ModelAdmin):
list_display = ('name', 'status',)
filter_horizontal = ('variety',)
class ProductcopyAdmin(admin.ModelAdmin):
list_display = ('name', 'status',)
filter_horizontal = ('variety',)
admin.site.register(Tag,TagAdmin)
admin.site.register(Productcopy,ProductcopyAdmin)
admin.site.register(Variety)
Ответы (2 шт):
Автор решения: Crosby
→ Ссылка
Чтобы именно в режиме реально времени выбирать tag и получать обновленный список для выбора - стандартными средствами админки это невозможно. Можно сделать так: выбираете tag, сохраняете, и потом уже верный список для выбора будет доступным. В целом, как-то так:
class ProductcopyAdmin(admin.ModelAdmin):
list_display = ('name', 'status',)
filter_horizontal = ('variety',)
def get_object(self, request, object_id, from_field=None):
obj = super().get_object(request, object_id, from_field=from_field)
request.product_obj = obj
return obj
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "variety" and hasattr(request, 'product_obj'):
kwargs["queryset"] = request.product_obj.tag.variety.all()
return super().formfield_for_manytomany(db_field, request, **kwargs)
class TagAdmin(admin.ModelAdmin):
list_display = ('name', 'status',)
filter_horizontal = ('variety',)
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "variety":
kwargs["queryset"] = Variety.objects.filter(children__isnull=True)
return super().formfield_for_manytomany(db_field, request, **kwargs)
Автор решения: mr ssopbi
→ Ссылка
решил с помощью smart-selects. ''' variety = ChainedManyToManyField( Variety, verbose_name="вариации", chained_field="tag", chained_model_field="tag", # auto_choose=True, horizontal=True ) '''
