【问题标题】:grappelli admin show imagegrappelli 管理员显示图像
【发布时间】:2011-11-15 15:46:37
【问题描述】:

我在 django 上有一个新项目,其中我使用 Grappelli 和文件浏览器,并且我已经扩展了用户以拥有与之相关的 UserProfile,我的问题是,我如何修改我的代码才能显示在上传头像的用户的UserProfile信息,并显示在用户列表中?

这是我现在的代码,我在管理员上看不到任何图像!

Admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from models import UserProfile

class UserProfileInline(admin.StackedInline):
     model = UserProfile
     verbose_name_plural = 'User Profile'
     list_display = ('city', 'tel', 'description', 'image_thumbnail',)

class MyUserAdmin(UserAdmin):
    list_display = ('username','email','first_name','last_name','date_joined',
        'last_login','is_staff', 'is_active',)
    inlines = [ UserProfileInline ]


admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

模型.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.utils.translation import ugettext_lazy as _
from apps.common.utils.abstract_models import BaseModel
from apps.common.utils.model_utils import unique_slugify
from filebrowser.base import FileObject
from django.conf import settings

class UserProfile(BaseModel):
    user = models.OneToOneField(User, related_name="profile")
    city = models.CharField(_("City"), max_length=200)
    tel = models.CharField(_("Phone Number"), max_length=50, 
    help_text=_("(Area Code) (Your phone number)"))
    description = models.TextField(null=True, blank=True, 
        help_text = _("Small description about yourself."))
    photo = models.ImageField(max_length=255, upload_to="profiles/", 
        null=True, blank=True, default="img/default_profile_image.png")

    def image_thumbnail(self):
        if self.photo:
             return u'<img src="%s" width="80" height="80" />' % self.photo.version(ADMIN_THUMBNAIL).url
        return u'<img src="/site_media/%s" width="80" height="80" />' % settings.DEFAULT_PROFILE_IMAGE

     image_thumbnail.allow_tags = True

    def __unicode__(self):
        if self.user.first_name or self.user.last_name:
            return "%s %s" % (self.user.first_name, self.user.last_name)
        else:
            return self.user.username

【问题讨论】:

    标签: django django-admin django-filebrowser django-grappelli


    【解决方案1】:

    我明白了,首先我想显示在用户模型的 UserProfile 内联部分为管理员选择的图像,以及在管理员的更改列表中选择的图像,这就是我的意思

    我像这样在用户配置文件的model.py上将models.ImageField更改为sorl ImageField

    from sorl.thumbnail import ImageField
    class UserProfile(BaseModel):
    [...]
        photo = ImageField(max_length=255, upload_to="profiles/", 
            null=True, blank=True, default="img/default_profile_image.png")
    

    然后在管理员上,我所要做的就是在 UserProfileInline 类上添加 sorl 的 AdminImageMixin,如下所示:

    from sorl.thumbnail.admin import AdminImageMixin
    
    class UserProfileInline(AdminImageMixin, admin.StackedInline):
        model = UserProfile
        verbose_name_plural = 'User Profile'
    

    这样您就可以在管理员的 UserProfile Inline 部分为该用户获取图像,现在用于 change_list。

    对于更改列表,我必须在 UserAdmin 类的 admin.py 文件中执行一个小的可调用函数,这就是我所做的,使用 sorl 的 get_thumbnail:

    from sorl.thumbnail import get_thumbnail
    
    class MyUserAdmin(UserAdmin):
    
        def image_thumbnail(self, obj):
            im = get_thumbnail(obj.get_profile().photo, '80x80', quality=99)
            return u"<img src='/site_media/%s' />" % im
        image_thumbnail.allow_tags = True
    
        list_display = ('image_thumbnail', 'username','email','first_name','last_name','date_joined',
        'last_login','is_staff', 'is_active',)
    

    现在我有一个用户配置文件的更改列表图像,也在 UserProfile 内联部分。

    希望这对所有人都有效...感谢@pastylegs 您之前的回答!

    【讨论】:

    • 对于您的第一种情况,即在您的内联中显示图像,我们如何增加出现的缩略图的大小? cmets 等待..!
    • @vijayshanker 你可以在这个答案上看到,最后一个代码示例特别是在第 6 行,有一个字符串 === '80x80' 你可以更改缩略图大小,指定其他尺寸,如 90x90 或 60x40
    【解决方案2】:

    list_display 需要是可调用的:

    https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

    所以你可以这样做:

    class UserProfileInline(admin.StackedInline):
    
        def image_thumbnail(self, obj):
            return obj.image_thumbnail()
        image_thumbnail.short_description = 'Thumbnail'
    
        model = UserProfile
        verbose_name_plural = 'User Profile'
        list_display = ('city', 'tel', 'description', 'image_thumbnail',)
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 2012-06-06
      • 2020-04-17
      • 2010-11-25
      • 2011-11-03
      • 1970-01-01
      • 2019-06-03
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多