4

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 ビデオのプレビューも必要です。ビデオを表示するための独自のウィジェットを作成し、それを偽のフィールドに適用する必要がありますか?

不要なフェイク フィールドのウィジェットでこの問題を解決するのは奇妙です。それとも普通のやり方ですか?

どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

2

AdminImageWidget に似たウィジェットを作成する必要がありますが、アップロード ボックスではなく画像のみを表示します。そのウィジェットを適用するには、カスタム フォーム クラスや偽のフィールドは必要ありません。ImageInline で formfield_overrides を使用するだけです。

class ImageInline(admin.TabularInline):
    ...
    formfield_overrides = { models.ImageField: {'widget': YourPreviewWidget}}

編集: おっと、ManyToManyField の問題を完全に処理しませんでした。実際の ImageFields を含むテーブルではなく、「スルー」テーブルのインラインを表示しています。それを考えると、あなたが今していることはそれほど悪い解決策ではないかもしれません。私が考えることができる別の方法は、現在選択されている Image オブジェクトの選択ボックスとプレビュー画像の両方を表示する方法を知っている、Select 用の特殊な置換ウィジェットを作成することです。そうすれば、偽の追加フィールドの必要性を回避できます。

于 2009-05-26T18:19:43.373 に答える