如何在Django admin的"prepopulated_fields"中区分大小写字母?

0 投票
1 回答
525 浏览
提问于 2025-04-17 11:51

我打算在Django的后台管理中使用'prepopulated_fields',通过视频ID获取YouTube的嵌入代码,像下面这样。

class VideoAdmin(admin.ModelAdmin):
prepopulated_fields = {"embed_code": ("embed_id",)}
inlines = (CourseVideoInline,)

但是我从"Rmp6zIr5y4U"这个视频ID得到的嵌入代码是"rmp6zir5y4u",所有的大写字母都变成了小写。

有没有什么办法可以解决这个问题?
或者有没有更好的方法可以通过自定义Django后台来从视频ID获取嵌入代码?

谢谢!
视频模型(相关字段)如下。

class Video(models.Model):    
  embed_code = models.TextField(max_length=1000)
  embed_id = models.CharField(max_length=200)

1 个回答

1

prepopulated_fields 主要是用来通过 JavaScript 从标题生成短链接的,所以你看到它是小写的。你可以考虑重写模型的保存函数,这样在保存模型实例的时候,就可以获取到 video_id 并生成嵌入代码:

class MyModel(models.Model):
     video_id = ...
     embed_code = ...

     def save(self, *args, **kwargs):
         # If we have enetered a video id, but there is not saved embed code, generate it
         if not self.embed_code and self.video_id:
             self.embed_code = "http://youtube.com/%s" % self.video_id
         super(MyModel, self).save(*args, **kwargs)

另一种方法是在管理界面层面上处理这个问题(而不是在模型层面)。你可以通过重写 save_model 方法 来实现,这样你就可以访问请求和表单了:

class MyModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        video_id = forms.cleaned_data.get('video_id', None)
        # If we are creating the object, and the video id is present
        if video_id and not change:
            obj.embed_code = video_id
        obj.save()

这段代码没有经过测试,只是用来说明你可能想要实现的两个地方。

撰写回答