私も同じ問題を抱えていました。私の試みの少なくとも1つがあなたのケースに役立つことを願っています:
この問題を(オーバーライドせずにForeignKeyRawIdWidget
)解決する最初の試みは、次のとおりでした。
form
サムネイルを表示するインライン管理者のプロパティを設定します
- サムネイルを表示するウィジェットを使用して、特定のフォームクラスに別のフィールドを追加します
ただし、フォームのコンストラクターの特定のフィールドにサムネイルに関するデータを挿入する必要があると考え、このソリューションを適切なソリューションとは見なさないため、このソリューションを放棄しました。
私の次の解決策はMultiWidget
、いくつかの分野に使用することでした。この場合、フォームに別のフィールドを追加する必要はなく、コンストラクターにサムネイルを挿入しなくても、ウィジェットにサムネイルを表示するために必要なデータがあります。
class ThumbnailMultiWidget(MultiWidget):
def decompress(self, value):
#has to be overriden
return [None,None]
class ThumbnailWidget(Widget):
def render(self, name, value, attrs=None):
#not quite sure what is in `value`, I've not been so far
return '<img src="%s"/>' % value.url
class PhotoInlineForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(PhotoInlineForm, self).__init__(*args, **kwargs)
wdgts = [self.fields['media'].widget, ThumbnailWidget()]
self.fields['media'].widget = ThumbnailMultiWidget(widgets=wdgts)
class Meta:
model = RecipePhoto
ForeignKeyRawIdWidget
しかし、サムネイルを表示するために必要なすべてのデータを含むインスタンスの表現(私が使用するウィジェット)が実際に存在することがわかったため、このソリューションも放棄しました。そしてそれが私の最終的な解決策です:
したがって、私のインラインアイテムはインラインレコードを選択するためのものであるため、既存のインラインレコードを表すために使用されるのメソッドを raw_id_field
単純にオーバーライドできます。通常は(私は思う)です。このメソッドを継承してオーバーライドし、画像のサムネイルを表示しました。label_for_value
ForeignKeyRawIdWidget
__unicode__
ForeignKeyRawIdWidget
class PhotoForeignKeyRawIdWidget(ForeignKeyRawIdWidget):
def label_for_value(self, value):
key = self.rel.get_related_field().name
try:
obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
except (ValueError, self.rel.to.DoesNotExist):
return ''
else:
"""
there's utilized sorl.thumbnail, but you can return st like this:
<img src='%s' /> % obj.media.url
"""
return Template("""{% load thumbnail %}
{% thumbnail image.image "120x120" crop="center" as one %}
<img src="{{ one.url }}" />
{% endthumbnail %}""").render(Context({
'image': obj
}))
class AppMediaInlineAdmin(admin.TabularInline):
model = AppMedia
extra = 1
def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
if db_field.name == 'media':
db = kwargs.get('using')
kwargs['widget'] = PhotoForeignKeyRawIdWidget(db_field.rel, self.admin_site, using=db)
return super(AppMediaInlineAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)