首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Django admin内联中只显示一个图像

如何在Django admin内联中只显示一个图像
EN

Stack Overflow用户
提问于 2012-04-06 22:44:14
回答 3查看 43.9K关注 0票数 25

我正在我的一个应用程序中使用django.contrib.admin

我的模型:

代码语言:javascript
复制
class Gallery(models.Model):
    location = models.ForeignKey(Location)
    date = models.CharField(max_length = 15)

class Image(models.Model):
    gallery = models.ForeignKey(Gallery)
    name = models.CharField(max_length=35)
    image = ImageField(upload_to='songs')

我的admin.py

代码语言:javascript
复制
class ImageInline(admin.StackedInline):
    model           = Image

class GalleryAdmin(admin.ModelAdmin):
    inlines = [ ImageInline, ]

在管理部分,我现在可以创建一个画廊,并在同一页上添加图像。默认情况下,django会显示三个图片上传表单。我怎么才能把它改成只有一个?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-06 22:50:12

检查InlineModelAdmin.extraInlineModelAdmin.max_num的文档。

我相信在你的例子中,max_num应该是1,extra是0。

票数 23
EN

Stack Overflow用户

发布于 2012-04-07 00:12:59

额外=0

代码语言:javascript
复制
class GalleryImageInline(admin.TabularInline):
    """
    Gallery Image inline
    """
    fieldsets = (
        (
            None, 
            {
                'fields': ('name', 'image',)
            }
        ),
    )

    model = Image
    extra = 0


class GalleryAdmin(admin.ModelAdmin):
    """
    Case Study Admin
    """
    fieldsets = (
        (
            None, 
            {
                'fields': ('location', 'date',)
            }
        ),
    )

    inlines = (GalleryImageInline, )
    list_display = ['location', 'date']
    list_filter = ['location', ]

在我看来,对于具有有用图像的内联,您需要实际显示图像内联(因此自定义覆盖图像小部件):

代码语言:javascript
复制
from django.contrib.admin.widgets import AdminFileWidget
from django.utils.translation import ugettext as _
from django.utils.safestring import mark_safe
import os
import Image

class AdminImageWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and getattr(value, "url", None):

            image_url = value.url
            file_name=str(value)

            # defining the size
            size='100x100'
            x, y = [int(x) for x in size.split('x')]
            try :
                # defining the filename and the miniature filename
                filehead, filetail  = os.path.split(value.path)
                basename, format    = os.path.splitext(filetail)
                miniature           = basename + '_' + size + format
                filename            = value.path
                miniature_filename  = os.path.join(filehead, miniature)
                filehead, filetail  = os.path.split(value.url)
                miniature_url       = filehead + '/' + miniature

                # make sure that the thumbnail is a version of the current original sized image
                if os.path.exists(miniature_filename) and os.path.getmtime(filename) > os.path.getmtime(miniature_filename):
                    os.unlink(miniature_filename)

                # if the image wasn't already resized, resize it
                if not os.path.exists(miniature_filename):
                    image = Image.open(filename)
                    image.thumbnail([x, y], Image.ANTIALIAS)
                    try:
                        image.save(miniature_filename, image.format, quality=100, optimize=1)
                    except:
                        image.save(miniature_filename, image.format, quality=100)

                output.append(u' <div><a href="%s" target="_blank"><img src="%s" alt="%s" /></a></div> %s ' % \
                (miniature_url, miniature_url, miniature_filename, _('Change:')))
            except:
                pass
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

注意:这做了一些你可能不喜欢的事情-所以你可能需要自己重写小部件的拇指大小部分。

因此,您需要覆盖内联表单中的小部件:

代码语言:javascript
复制
class GalleryImageForm(forms.ModelForm):
    """
    Image Admin Form
    """
    class Meta:
        model = Image
        widgets = {
            'image' : AdminImageWidget,
        }

class GalleryImageInline(admin.TabularInline):
    ...
    form = GalleryImageForm
    ...

你最终会得到类似这样的东西(这是另一个项目的一部分,有一堆额外的东西):

票数 28
EN

Stack Overflow用户

发布于 2013-11-08 21:49:32

如果您使用sorl-thumbnails,widget如下所示:

代码语言:javascript
复制
from django.contrib.admin.widgets import AdminFileWidget
from django.utils.safestring import mark_safe
from sorl import thumbnail


class AdminImageWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and getattr(value, "url", None):
            t = thumbnail.get_thumbnail(value,'100x100')
            output.append('<img src="{}">'.format(t.url))
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))


class GalleryImageForm(forms.ModelForm):
    """
    Image Admin Form
    """
    class Meta:
        model = Image
        widgets = {
            'image' : AdminImageWidget,
        }

class GalleryImageInline(admin.TabularInline):
    ...
    form = GalleryImageForm
    ...
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10045064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档