Django: Display image in admin interface

前端 未结 7 1806
盖世英雄少女心
盖世英雄少女心 2020-11-28 23:00

I\'ve defined a model which contains a link an image. Is there a way to display the image in the model items list? My model looks like this:

class Article(mo         


        
相关标签:
7条回答
  • 2020-11-28 23:17

    You can overwrite django admin view for your model. See http://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-admin-templates for more details.

    In a brief you need to create a template: templates/admin/your_app/article/change_form.html And there add html to display the image.

    0 讨论(0)
  • 2020-11-28 23:21
    def image_tag(self, obj):
        return u'<img src="%s" />' % obj.image
    
    image_tag.short_description = 'Image'
    image_tag.allow_tags = True
    

    and in your admin.py add:

       readonly_fields = ('image_tag',)
    
    0 讨论(0)
  • 2020-11-28 23:21

    you can also add the image directly in admin

    class ArticleAdmin(admin.ModelAdmin):
    
         def admin_image(self, obj):                       
            return '<img src="%s"/>' % obj.img
         admin_image.allow_tags = True
    
         list_display = ('url', 'title', 'admin_image')
    
    0 讨论(0)
  • You can create a model instance method with another name, allow HTML tags for its output and add this method as a list field. Here is an example:

    First add a new method returning the HTML for the image inclusion:

    class Article(models.Model):
        ...
        def admin_image(self):
            return '<img src="%s"/>' % self.img
        admin_image.allow_tags = True
    

    Then add this method to the list:

    class ArticleAdmin(admin.ModelAdmin):    
        ...
        list_display = ('url', 'title', 'admin_image')
    
    0 讨论(0)
  • 2020-11-28 23:36

    (I'm using Django 1.5) In addition to following the steps in the accepted answer, I ALSO had to mark the image tag as being "safe"

    To do this, wrap the return value with the mark_safe method of django.utils.safestring package.

    code example: https://stackoverflow.com/a/14075441/1063031

    django docs: https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#filters-and-auto-escaping

    0 讨论(0)
  • 2020-11-28 23:38

    UPDATE 2020

    Because this answer is getting a lot of traction recently, I decided to make small edit. According to django doc it is recommended to use function format_html. As @chem1st suggested, if you need it only for admin, everything can be made in admin.py only.

    My models.py

    from django.db import models
    
    class Product(models.Model):
        title = models.CharField(max_length=120)
        description = models.TextField()
        price = models.DecimalField(decimal_places = 2, max_digits = 20, default = 00.00)
        image = models.ImageField(upload_to=change_image_name, null=True, blank=True)
    
        def __str__(self):
            return self.title
    

    My admin.py

    from django.contrib import admin
    from django.utils.html import format_html
    
    from .models import Product
    
    class ProductAdmin(admin.ModelAdmin):
        list_display = ('title', 'description', 'price', 'image_tag')
    
        def image_tag(self,obj):
            return format_html('<img src="{0}" style="width: 45px; height:45px;" />'.format(obj.image.url))
    
    admin.site.register(Product, ProductAdmin)
    

    UPDATE django 2.0.6

    I was solving this problem in latest django 2.0.6. I wanted to achiave to have image thubnail and some more details in listview in django-admin.

    Picture below is my default admin listview.

    This is my models.py:

    from django.db import models
    from django.utils.safestring import mark_safe
    
    # Create your models here.
    
    class Product(models.Model):
        title = models.CharField(max_length=120)
        description = models.TextField()
        price = models.DecimalField(decimal_places = 2, max_digits = 20, default = 00.00)
        image = models.ImageField(upload_to=change_image_name, null=True, blank=True)
    
        def image_tag(self):
            if self.image:
                return mark_safe('<img src="%s" style="width: 45px; height:45px;" />' % self.image.url)
            else:
                return 'No Image Found'
        image_tag.short_description = 'Image'
        
    
        def __str__(self):
            return self.title
    

    Please notice I had to use mark_safe() on image string, otherwise you will get escaped html code instead of thubnail in django-admin

    Finally this is my admin.py

    from django.contrib import admin
    
    from .models import Product
    # Register your models here.
    class ProductAdmin(admin.ModelAdmin):
        list_display = ('title', 'description', 'price', 'image_tag')
    
    admin.site.register(Product, ProductAdmin)
    

    Here we have to register ProductAdmin class too, I didn't know that and it didn't work.

    This is result:

    0 讨论(0)
提交回复
热议问题