gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:29:47 25 4
gpt4 key购买 nike

创建新对象(未绑定(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/

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