django - 如何加载 ClearableFileInput/FileField 的初始值(在绑定(bind)表单之前)

标签 django django-models django-forms

创建新对象(未绑定(bind)表单)时,如何设置将在 ClearableFileInput 小部件中显示的 FileField 的初始值?

我尝试了以下但widget.value不返回 FeildFile实例,如果这是用户第一次创建对象:

模型.py

class MyModel(models.Model):
    myfile=models.FileField()

表格.py
class MyForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['myfile'].initial= 'myfile.pdf'

    class Meta:
        model = Issuer
        fields = ['myfile']

这导致:

enter image description here

同样,在模型字段中设置默认值也不起作用:
class MyModel(models.Model):
    myfile=models.FileField(default='myfile.pdf')

小部件初始值仍然是 None , 但如果它留空并保存文件对象 myfile.pdf 被创建。 settings.MEDIA_URLurls.py绝对正确,并且文件在系统上,因为它是在表单保存后加载的。

我缺少的是在保存表单和创建对象之前将其显示为初始值。

This答案表明您无法提供初始数据,但您可以使用 url 提供初始值属性来伪造文件的外观。不过,目前尚不清楚您将如何做到这一点。

尝试在表单中创建初始文件对象也会返回 widget.value = None
class MyForm(forms.ModelForm):

    f_path = os.path.join(settings.BASE_DIR + settings.MEDIA_URL, 'myfile.pdf')

    f = open(f_path)
    myfile = File(f)

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['privacy_policy'].initial = self.myfile

最佳答案

您的最后一段代码非常接近。

您实际上是通过 ClearableFileInput 告诉用户小部件,如果用户没有在文件输入中输入任何内容,则初始值将是您的 pdf 文件。

但是,这只是为了展示,你必须在保存实例时实际放置逻辑! (FileField 不会为你做)所以正确的做法是覆盖 save()表单的方法,在创建的情况下,将实际文件作为值。像这样:

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        path = os.path.join(settings.MEDIA_ROOT, 'myfile.pdf')

        self.default_file = open(path)

        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['privacy_policy'].initial = File(self.default_file)
        self.fields['privacy_policy'].initial.url = default_storage.url('myfile.pdf')

    def save(self, commit=True):
        # Actually put the default file as a value if no input for creation
        if not self.instance.pk and not self.cleaned_data.get('privacy_policy'):
            self.instance.privacy_policy = self.default_file
            self.instance.privacy_policy._committed = True
        super().save(commit)

关于django - 如何加载 ClearableFileInput/FileField 的初始值(在绑定(bind)表单之前),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62101105/

相关文章:

Django:ModelForm 自定义错误消息和占位符

python - 扩展形式悄无声息地失败了

Django-rest-framework json 转储

django - 在模板中显示外键上的Django values()作为对象而不是其ID

django - 在 django 中拥有多种类型的成员配置文件的更好方法是什么

django-admin - django 中的多态内联模型形式

python - Django:插入时多对多关系的新记录

Django:ORM 是否支持 SQL "IN"运算符?

Django - 将代理模型简化为单个类

python - Django ORM 查询限制特定键实例