Aには3つのモデルがあります:ManyToManyField関係を持つプロジェクト、画像、ビデオ:
class Project(models.Model):
images = models.ManyToManyField('Image', through='Project_Images')
video = models.ManyToManyField('Video', through='Project_Video')
class Image(models.Model):
original = models.ImageField()
projects = models.ManyToManyField('Project', through='Project_Images')
class Video(models.Model):
projects = models.ManyToManyField('Project', through='Project_Video')
現在のプロジェクトにリンクされた画像と動画のインライン フォームを使用して、プロジェクトの管理フォームを構成します。
class ProjectAdmin(admin.ModelAdmin):
inlines = [VideoInline, ImagesInline]
class ImagesInline(admin.TabularInline):
model = Project_Images
raw_id_fields = ['project','image']
class VideoInline(admin.TabularInline):
model = Project_Video
raw_id_fields = ['project','video']
しかし、単純な選択フィールドと削除チェックボックスを備えたインラインテーブルは私にとって非常に悲惨であり、ここで画像またはビデオ (youtube) のプレビューを表示したいと考えています。AdminImageWidgetの助けを借りて、画像についてこれを解決します。
class ImageForm(forms.ModelForm):
class Meta:
model = Image
preview = forms.ImageField(widget=AdminImageWidget())
def __init__(self, *args, **kwargs):
super(ImageForm, self).__init__(*args, **kwargs)
try:
image = Image.objects.get(id=self.instance.image_id)
self.fields["preview"].initial = image.original
except:
pass
class ImagesInline(admin.TabularInline):
.....
form = ImageForm
これを行うのが最善の方法ですか?私の場合、ファイルのアップロード入力は必要ありません。インラインフォームテーブルの画像プレビューのみです。YouTube ビデオのプレビューも必要です。ビデオを表示するための独自のウィジェットを作成し、それを偽のフィールドに適用する必要がありますか?
不要なフェイク フィールドのウィジェットでこの問題を解決するのは奇妙です。それとも普通のやり方ですか?
どんな助けでも大歓迎です!ありがとう!