gpt4 book ai didi

django - 多对多关系的管理内联表单中的图像和视频预览

转载 作者:行者123 更新时间:2023-12-02 05:48:26 26 4
gpt4 key购买 nike

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 视频,我应该编写自己的小部件来显示视频并将其应用到某个假字段吗?

通过小部件解决不必要的假字段这个问题很奇怪。还是正常的方式?

任何帮助将不胜感激!谢谢!

最佳答案

您应该创建一个类似于 AdminImageWidget 的小部件,但它仅显示图像,而不显示上传框。要应用该小部件,您不需要自定义 Form 类或伪字段,只需在 ImageInline 上使用 formfield_overrides 即可:

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

编辑:哎呀,没有完全处理ManyToManyField问题 - 您正在显示“通过”表的内联,而不是具有实际ImageFields的表。鉴于此,您现在所做的可能不是一个糟糕的解决方案。我能想到的替代方案是为选择编写一个专门的替换小部件,它知道如何显示选择框和当前选定的图像对象的预览图像。这样您就可以避免需要假的额外字段。

关于django - 多对多关系的管理内联表单中的图像和视频预览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/907233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com