Прежде всего, после прочтения этого вопроса, не стесняйтесь предлагать изменения для названия, потому что я не уверен, что набирать
У меня есть эта иерархия .. Stone
-> Subtype
-> Subtype
-> Subtype
, и это продолжается до тех пор, пока Stone
имеет Subtype
в реальной жизни. Так что неизвестно, сколько раз я добавлю Subtypes
к указанному c камню. Давайте проверим это
# models.py
from django.db import models
from django.utils.safestring import mark_safe
class Stone(models.Model):
name = ...
sub_type = models.ForeignKey('StoneSubType', on_delete=models.DO_NOTHING ,related_name='stones', blank=True, null=True)
class StoneSubType(models.Model):
name = ...
sub_type = models.ManyToManyField('self', related_name='sub_types', blank=True)
class StoneSubtypeImage(models.Model):
stone = models.ForeignKey('StoneSubType', on_delete=models.CASCADE, related_name='images')
image = models.ImageField(default=None, upload_to='stone_subtypes/')
class StoneImage(models.Model):
stone = models.ForeignKey('Stone', on_delete=models.CASCADE, related_name='images')
image = models.ImageField(default=None, upload_to='stones/')
def image_tag(self):
return mark_safe(f'<img src="{self.image.url}">')
Давайте go страницу администратора, чтобы проиллюстрировать, что я хочу

Теперь, Каждый Subtype
имеет несколько изображений, а само Stone
имеет некоторые изображения, конечно, изображения, как показано в коде, поэтому я заставил их появиться на странице администратора в виде Inline
, который отображается там, когда я прокручиваю вниз. Вот так

Теперь я хочу показать изображения Subtype
рядом с полем Subtype
. Любые предложения о том, как мы можем сделать это?
Мой лимит был на показ встроенных изображений на той же странице. Результаты поиска думают, что я этого хочу, но дело не в том
На данный момент я нашел решение. Но он не вставляет изображения рядом с их полем.
Это менеджер моделей подтипов
class StoneSubtypeAdmin(admin.ModelAdmin):
inlines = [StoneSubtypeImagesInline]
search_fields = ['name', 'category', 'price', 'color__name',]
filter_horizontal = ['sub_type']
fields = ['name', 'sub_type', 'sub_type_images', 'category', 'block_num', 'salab_num', 'barcode', 'commercial_size', 'price', 'details', 'town', 'country', 'color', 'surface' ]
readonly_fields = ['sub_type_images']
def sub_type_images(self, obj):
if obj.sub_type is not None:
output = '' # html here
for sub_type in obj.sub_type.all():
for image in sub_type.images.all():
output += (
f'<div class="column">'
f'<h3 class="heading"> {obj.name} </h3>'
f'<a href="/admin/core/stonesubtype/{sub_type.pk}/"><img src="{image.image.url}" style="max-height: 300px"></a>'
f'</div>'
)
output = f'<div class="image_grid"> {output}</div> <style> .image_grid {{display: grid; grid-template-columns: repeat(auto-fill, 250px); grid-template-rows: auto auto auto; .heading {{ font-size: 20p !important; display: inline-block; }} .column {{ display: flex; flex-direction: column }} </style>'
return mark_safe(output)
, и он отображает изображения теперь под Subtype
как отдельное поле. Решение становится ближе.