Grappelli Admin показать изображение - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть новый проект на django, в котором я использую Grappelli и filebrowser, и я расширил пользователя, чтобы иметь связанный с ним 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)

Models.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

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Ну, я понял, сначала я хотел показать изображение, выбранное во встроенном разделе UserProfile модели пользователя для администратора, а также в списке изменений администратора, так что вот что я

Я изменил модели. ImageField для сортировки ImageField на model.py в профиле пользователя, как это

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")

Затем для администратора все, что мне нужно было сделать, это добавить AdminImageMixin от sorl в класс UserProfileInline, например:

from sorl.thumbnail.admin import AdminImageMixin

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

И таким образом вы получаете изображение в разделе UserProfile Inline администратора для этого пользователя, теперь для change_list.

Для списка изменений мне нужно было сделать небольшую вызываемую функцию внутри файла admin.py в классе UserAdmin, вот что я сделал, используя 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 Inline.

Надеюсь, это сработает для всех ... и спасибо @pastylegs за ваш предыдущий ответ!

1 голос
/ 15 ноября 2011

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',)
...