#python #django #django_admin #django_filter
изучаю django, и застрял на вопросе как сделать фильтрацию.
Простая фильтрация с использованием filter_horizontal = ('field name') к сожалению
мне не подходит, т.к он фильтрует по имени элемента а не по общему полю(
Нужна примерна такая реализация как это делается list_filter = ['field name'], но
т.к мое поле указывает инлайново(скрин 1), list_filter соответственно не работает.
Пример такой, у меня есть 4 элементов.
name = Белый , material = Дуб
name = Красный, material = Дуб
name = пурпурный, material = Метал
name = глянцевый, material = Метал
И мне при заполнение в Админки товара надо выдать не общим списком manyToManyField(на
скрине есть это поле) и фильтром filter_horizontal, который будет фильтровать по name,
а нужен фильтр который бы фильтровал по полю material, то есть по общему значению(скрин
2, как это реализуется стандартным list_filter. Реально ли такое реализовать? может
есть какой виджет? Пытался копать в сторону get_ordering, но не понимаю как в него
каждый раз передавать material.
Модели models.py
#модель для вывода inlines у товара
class ImgPropertyMaterialProduct(models.Model):
product = models.ForeignKey(Product)
material = models.ForeignKey(MaterialPropery)
colors = models.ManyToManyField(ImgPropertyMaterial, blank=True, verbose_name='Цвета')
#модель для заполнения property
class ImgPropertyMaterial(models.Model):
position = models.CharField(max_length=5, verbose_name='Позиция для сортировки')
material = models.ForeignKey(MaterialPropery)
type = models.CharField(max_length=40, default='color', db_index=True,
choices=(('color', 'Цвет'), ('texture', 'Текстура')))
value = models.CharField(max_length=40, unique=True, verbose_name='Значение')
photo = models.ImageField(upload_to=PhotoPath('color_propery/photo'), null=True,
verbose_name='Фото')
class Meta:
verbose_name = 'Свойство: Изображение материала'
verbose_name_plural = 'Свойство: Изображение материалов'
def __str__(self):
return self.value
И обычный горизонтальный фильтр в админки
class RowInlineTwo(admin.StackedInline):
model = ImgPropertyMaterialProduct
filter_horizontal = ('colors',)
Ответы
Ответ 1
У вас очень сумбурный текст вопроса. Я так и не смог понять, что же вам всё таки нужно - list_filter или filter_horizontal. Если первое, то всё просто: list_filter = ['colors__material'] А если надо ограничить элементы доступные в filter_horizontal, то чуточку сложнее: class ProductAdmin(admin.ModelAdmin): filter_horizontal = ['colors'] def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == 'colors': obj_id = request.resolver_match.kwargs['object_id'] obj = self.get_object(request, obj_id) kwargs['queryset'] = ImgPropertyMaterial.objects.filter(material=obj.material) return super().formfield_for_manytomany(db_field, request, **kwargs)
Комментариев нет:
Отправить комментарий