创建新对象(未绑定(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']
这导致:
同样,在模型字段中设置默认值也不起作用:
class MyModel(models.Model):
myfile=models.FileField(default='myfile.pdf')
小部件初始值仍然是
None
, 但如果它留空并保存文件对象 myfile.pdf
将被创建。 settings.MEDIA_URL
和 urls.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/