Проверить форму Django с локальными файлами - PullRequest
0 голосов
/ 27 июня 2018

На моей веб-странице есть возможность загружать видео с помощью формы, но я хотел расширить ее функциональные возможности, добавив возможность предоставления URL-адреса YouTube вместо загрузки файла.

С загрузкой файла проблем нет, так как я проверяю форму из модели:

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) не будет работать сам по себе как запрос. ФАЙЛЫ пустые, но я пробовал много вещей, таких как:

form = VideoForm(request.POST,
                 MultiValueDict({'file': [open(fname,'r')]}))

и VideoForm всегда возвращает:

<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') возвращает {'file': <open file u'markst.mp4', mode 'r' at 0x7f375b654db0>}

Надеюсь, моя проблема ясна, и заранее спасибо!

1 Ответ

0 голосов
/ 27 июня 2018

Мне удалось решить эту проблему с помощью объекта 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().

Надеюсь, это поможет кому-то с той же проблемой, с которой я столкнулся.

...