Администратор Django и отображение миниатюр
Я пытаюсь показать уменьшенные изображения в администраторе Django, но я могу видеть только путь к изображениям, но не отображаемые изображения. Я не знаю, что я делаю неправильно.
URL-адрес медиасервера сервера:
from django.conf import settings
(r'^public/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
Функциональная модель:
def image_img(self):
if self.image:
return u'<img src="%s" />' % self.image.url_125x125
else:
return '(Sin imagen)'
image_img.short_description = 'Thumb'
image_img.allow_tags = True
admin.py:
class ImagesAdmin(admin.ModelAdmin):
list_display= ('image_img','product',)
И результат:
<img src="http://127.0.0.1:8000/public/product_images/6a00d8341c630a53ef0120a556b3b4970c.125x125.jpg" />
Ответы
Ответ 1
Это источник photologue (см. models.py
, немного приспособленный для удаления ненужных вещей):
def admin_thumbnail(self):
return u'<img src="%s" />' % (self.image.url)
admin_thumbnail.short_description = 'Thumbnail'
admin_thumbnail.allow_tags = True
бит list_display
тоже выглядит одинаковым, и я знаю, что это работает. Единственное, что кажется мне подозрительным - это ваш отступ - две строки, начинающиеся image_img
в конце вашего кода models.py
, должны быть на уровне def image_img(self):
, например:
def image_img(self):
if self.image:
return u'<img src="%s" />' % self.image.url_125x125
else:
return '(Sin imagen)'
image_img.short_description = 'Thumb'
image_img.allow_tags = True
Ответ 2
Обновление версии 1.9
Обратите внимание, что в Django v.1.9
image_tag.allow_tags = True
Забастовкa >
лишен, и вместо этого вы должны использовать format_html(), format_html_join() или mark_safe()
Итак, ваш model.py должен выглядеть так:
...
def image_img(self):
if self.image:
return marksafe('<img src="%s" />' % self.image.url_125x125)
else:
return '(Sin imagen)'
image_img.short_description = 'Thumb'
и в вашем admin.py добавьте:
list_display= ('image_img','product',)
readonly_fields = ('image_img',)
и для добавления его в "Режим редактирования" панели администратора в admin.py add:
fields = ( 'image_img', )
Ответ 3
Добавьте метод в вашу модель (models.py
):
def image_tag(self):
return u'<img src="%s" />' % <URL to the image>
image_tag.short_description = 'Image'
image_tag.allow_tags = True
и в вашем ModelAdmin (admin.py
) добавьте:
readonly_fields = ('image_tag',)
Ответ 4
Добавляя к @dominic, я хотел использовать это в нескольких моделях, поэтому я создал функцию, которую я мог бы вызвать в каждой модели, вводя изображение, которое будет отображаться.
Например, в одном приложении у меня есть:
from django.contrib import admin
from .models import Frontpage
from ..admin import image_file
class FrontpageAdmin(admin.ModelAdmin):
list_display = ('image_thumb', ...)
image_thumb = image_file('obj.image()')
admin.site.register(Frontpage, FrontpageAdmin)
с image
функцией Frontpage, которая возвращает изображение.
В другом приложении у меня есть:
from django.contrib import admin
from .models import Exhibition
from ..admin import image_file
class ExhibitionAdmin(admin.ModelAdmin):
list_display = ('first_image_thumb', ...)
first_image_thumb = image_file('obj.related_object.image',
short_description='First Image')
admin.site.register(Exhibition, ExhibitionAdmin)
Это позволяет мне указать объект изображения и short_description
, сохраняя шаблон в другом файле. Функция:
from sorl.thumbnail import get_thumbnail
from django.conf import settings
def image_file(image, short_description='Image'):
def image_thumb(self, obj):
image = eval(image_thumb.image)
if image:
thumb = get_thumbnail(image.file, settings.ADMIN_THUMBS_SIZE)
return u'<img width="{}" height={} src="{}" />'.format(thumb.width, thumb.height, thumb.url)
else:
return "No Image"
image_thumb.__dict__.update({'short_description': short_description,
'allow_tags': True,
'image': image})
return image_thumb
Ответ 5
С django-imagekit вы можете добавить любое изображение следующим образом:
from imagekit.admin import AdminThumbnail
@register(Fancy)
class FancyAdmin(ModelAdmin):
list_display = ['name', 'image_display']
image_display = AdminThumbnail(image_field='image')
image_display.short_description = 'Image'
# set this to also show the image in the change view
readonly_fields = ['image_display']
Ответ 6
Так как allow_tags устарела, вы должны использовать функцию format_html
. Пример кода выглядит следующим образом:
файл models.py
:
class TestAdminModel(models.Model):
img = models.URLField()
файл admin.py
:
from django.utils.html import format_html
class TestAdmin(admin.ModelAdmin):
list_display = ["id", "img", "thumbnail"]
def thumbnail(self, obj):
return format_html('<img src="{}" style="width: 130px; \
height: 100px"/>'.format(obj.img))
thumbnail.short_description = 'thumbnail'
admin.site.register(models.TestAdminModel, TestAdmin)
Результат выглядит так: ![enter image description here]()
Вы можете увидеть более подробную информацию из документации Django.