python - 转换(并验证)在 django admin 中添加的文件

标签 python django

我正在开发一个使用自定义问候语(如语音邮件)的 Django 项目。整个功能已实现,我创建了一个自定义模型:

class Greeting(models.Model):
    audio_file = models.FileField(upload_to='greetings/')
    description = models.CharField(max_length=128)
    uploaded_at = models.DateTimeField(auto_now_add=True)

我想做的下一件事是确保上传的文件具有所有预期的属性(是 WAV 文件、具有一个 channel 、具有低比特率等)。但我什至不知道从哪里开始。这些文件只能通过 django admin 添加。在常规 FormView 中,我会在 View 中利用服务器端验证,然后才将其添加到模型中。如何在 django admin 中做到这一点?

总结一下我希望我的应用程序做什么:

1) 将文件添加到 django admin 中的模型中 2) 服务器检查文件属性,如果不满足要求,则尝试将其转换为正确的格式 3) 如果文件格式正确,则仅保存对象。

最佳答案

您需要使用自定义表单注册 ModelAdmin。 ModelAdmin 有一个 form 属性,默认设置为 forms.ModelForm 类,您可以通过将该属性分配给 Admin 类来替换它。

# app_dir/admin.py
from django.contrib import admin

from .forms import GreetingAdminForm
from .models import Greeting

@admin.register(models.Greeting)
class GreetingAdmin(admin.ModelAdmin):
    form = GreetingAdminForm
    readonly_fields = ['uploaded_at']

您需要在 forms.py 中定义 GreetingAdminForm。具有自定义验证逻辑。 我的方法是添加一个 ModelForm ,其中包含覆盖的 audo_file 字段和添加的验证器。您可以查看 django 文档来编写验证逻辑 here

您可能想使用文件扩展名验证,并在表单上添加 clean_{fieldname} 方法。 clean_{fieldname} 方法不接受任何参数,但该方法的返回值必须替换 clean_data 中的现有值。您将需要一个适合您的需求的外部库,接受您想要允许的音频格式,并以所需的格式输出处理后的文件。有关清洁特定属性的文档是 here

# app_dir/forms.py
from django import forms
from django.core.exceptions import ValidationError

from .validators import validate_file_extension
from .models import Greeting

class GreetingAdminForm(forms.ModelForm):
    audio_file = forms.FileField(validators=[validate_file_extension])

    def clean_audio_file(self):
        data = self.cleaned_data
        processed_audio_file = None
        # audio file processing logic goes here, 

        if  not processed_audio_file:
            raise ValidationError('error message')
        data['audio_file'] = processed_audio_file
        return data

    class Meta:
        model = Greeting
        fields = [
            'audio_file',
            'description'
        ]


# app_dir/validators.py
def validate_file_extension(value):
    # validate file extension logic here, 

您可以找到文件扩展名验证的示例 here

解决这个问题的另一个角度也可以是 - 编写一个自定义表单字段,该字段是 FileField 的子类,您可以找到有关编写自己的字段的文档 here ,这个类应该重写 w 方法 validate() - 它处理验证逻辑,并覆盖 python,您可以在其中准备输出以在 python 代码中可用

关于python - 转换(并验证)在 django admin 中添加的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55118185/

相关文章:

python - 如何在谷歌应用引擎中使用whois

python - 导入错误 : No module named 'django.contrib.gis.django'

python - 如何列出 Django 中所有与表单相关的错误?

python - 如何在 View 中更改 Django 数据库架构?

python - 运行递归二进制搜索算法时出现段错误

java - Scala/Java 中的简单、无忧、零样板序列化,类似于 Python 的 Pickle?

python - 在拟合随机森林分类器时遇到问题

python - jinja2:将字符串转换为字典对象?

database - Django 表单我无法保存图片文件

python - Mixin 在每次页面加载时返回一个随机对象