使用本地文件验证 Django 表单
Validate django form with local files
我的网页有使用表单上传视频的选项,但我想扩展其功能,添加提供 YouTube URL 而不是上传文件的选项。
文件上传没有问题,因为我从模型验证了表单:
forms.py
class VideoForm(forms.ModelForm):
class Meta:
model = Video
fields = ('file', 'description', 'url')
models.py
class Video(models.Model):
file = models.FileField(upload_to=video_directory_path)
description = models.TextField(blank=True)
url = models.CharField(max_length=255, blank=True)
一切正常,但是当我尝试发送视频的 URL 时,form = VideoForm(request.POST, request.FILES)
将无法正常工作,因为 request.FILES 是空的,但我试过了许多事情,例如:
form = VideoForm(request.POST,
MultiValueDict({'file': [open(fname,'r')]}))
并且 VideoForm 总是 returns:
<tr><th><label for="id_file">File:</label></th><td><ul class="errorlist"><li>No file was submitted. Check the encoding type on the form.</li></ul><input type="file" name="file" required id="id_file" /></td></tr>
<tr><th><label for="id_description">Description:</label></th><td><textarea name="description" rows="10" cols="40" id="id_description">
</textarea></td></tr>
<tr><th><label for="id_url">Url:</label></th><td><input type="text" name="url" value="https://www.youtube.com/watch?v=kj7wTDK5Vx8" id="id_url" maxlength="255" /></td></tr>
问题是,有没有办法用本地文件设置request.FILES
来验证表单?我使用 pytube 库来下载视频,它工作正常,因为当我执行 open(fname,'r').read()
和 open(fname,'r')
[=44 时它显示比特流=] {'file': <open file u'markst.mp4', mode 'r' at 0x7f375b654db0>}
希望我的问题得到解决,在此先感谢!
我设法通过以下方式使用 Django 的 File
对象解决了这个问题:
from django.core.files import File
from django.utils.datastructures import MultiValueDict
file = open(fname, 'r') # Reads the downloaded video
fileform = File(file)
form = VideoForm(data=request.POST, files=MultiValueDict({'file': [fileform]}))
至此,表单对象在做form.is_valid()
时终于通过了验证。
我希望这可以帮助遇到同样问题的人。
我的网页有使用表单上传视频的选项,但我想扩展其功能,添加提供 YouTube URL 而不是上传文件的选项。
文件上传没有问题,因为我从模型验证了表单:
forms.py
class VideoForm(forms.ModelForm):
class Meta:
model = Video
fields = ('file', 'description', 'url')
models.py
class Video(models.Model):
file = models.FileField(upload_to=video_directory_path)
description = models.TextField(blank=True)
url = models.CharField(max_length=255, blank=True)
一切正常,但是当我尝试发送视频的 URL 时,form = VideoForm(request.POST, request.FILES)
将无法正常工作,因为 request.FILES 是空的,但我试过了许多事情,例如:
form = VideoForm(request.POST,
MultiValueDict({'file': [open(fname,'r')]}))
并且 VideoForm 总是 returns:
<tr><th><label for="id_file">File:</label></th><td><ul class="errorlist"><li>No file was submitted. Check the encoding type on the form.</li></ul><input type="file" name="file" required id="id_file" /></td></tr>
<tr><th><label for="id_description">Description:</label></th><td><textarea name="description" rows="10" cols="40" id="id_description">
</textarea></td></tr>
<tr><th><label for="id_url">Url:</label></th><td><input type="text" name="url" value="https://www.youtube.com/watch?v=kj7wTDK5Vx8" id="id_url" maxlength="255" /></td></tr>
问题是,有没有办法用本地文件设置request.FILES
来验证表单?我使用 pytube 库来下载视频,它工作正常,因为当我执行 open(fname,'r').read()
和 open(fname,'r')
[=44 时它显示比特流=] {'file': <open file u'markst.mp4', mode 'r' at 0x7f375b654db0>}
希望我的问题得到解决,在此先感谢!
我设法通过以下方式使用 Django 的 File
对象解决了这个问题:
from django.core.files import File
from django.utils.datastructures import MultiValueDict
file = open(fname, 'r') # Reads the downloaded video
fileform = File(file)
form = VideoForm(data=request.POST, files=MultiValueDict({'file': [fileform]}))
至此,表单对象在做form.is_valid()
时终于通过了验证。
我希望这可以帮助遇到同样问题的人。