Сохранить ввод данных пользователем после отправки в форме Django - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь создать веб-сайт, используя Django. Я не знаком с Django, и у меня проблема. Я хотел бы создать форму, в которой есть выбор файлов для загрузки видео и две разные кнопки: «Загрузить» и «Сохранить». Я не хочу сохранять видео напрямую в базу данных с помощью одной кнопки. Из-за этого мне нужны две кнопки. Когда пользователь выбирает файл и нажимает кнопку «Загрузить», видео должно быть загружено. Затем, если пользователь нажимает кнопку «Сохранить», видео должно быть сохранено в базе данных (модели). Нет проблем с выбором и загрузкой видео. Однако когда я нажимаю кнопку «Сохранить», видео не может быть сохранено, так как видео исчезает после нажатия кнопки «Загрузить».

HTML файл:

<form method="post" enctype="multipart/form-data" id="form1">
  <div class="form-group" >
    <label for="exampleFormControlFile1">Upload your video: </label>
    {% csrf_token %}
    {{ form.as_p }}
  </div>
  <button class="btn btn-primary btn-lg" name="upload_bttn" id="bttn1" type="submit" >Upload</button>
  <button class="btn btn-primary btn-lg" name="save_bttn" type="submit" >Save</button>

  <p>Uploaded file: <a href="{{url}}" target="_blank">{{url}}</a></p>

views.py

def video_upload(request):
    context = {}
    if request.method == 'POST' and 'upload_bttn' in request.POST: 
        uploaded_file = request.FILES['videofile']
        task_name = request.POST['task']
        env_name = request.POST['environment']
        light_name = request.POST['lightcondition']
        fs = FileSystemStorage()
        file_name = fs.save(uploaded_file.name, uploaded_file)
        url = fs.url(file_name)
        context['url'] = url
        form = VideoForm(request.POST, request.FILES)
    elif request.method == 'POST' and 'save_bttn' in request.POST: 
        form = VideoForm(request.POST, uploaded_file)
        if form.is_valid():
            form.save()
            return redirect('video-upload')
    else:
        form = VideoForm()
    context['form'] = form
    return render(request, 'video_upload.html', context)

class VideoForm(forms.ModelForm):
    class Meta:
        model = Video
        fields = ("videofile","task","environment","lightcondition")

models.py

class Video(models.Model):
    videofile= models.FileField(upload_to='video', null=True, verbose_name="")
    task = models.CharField(max_length=9, choices=[
        ('task1','task1'),
        ('task2','task2')],default='undefined')
    environment = models.CharField(max_length=9, choices=[
        ('env1','env1'),
        ('env2','env2'),
        ('env3','env3')],default='undefined')
    lightcondition = models.CharField(max_length=9, choices=[
        ('light1','light1'),
        ('light2','light2'),
        ('light3','lighh3')],default='undefined')

    def __str__(self):
        return str(self.videofile, self.task, self.environment,self.lightcondition)

Когда я использую эти коды, я могу загрузить видеофайл и отправить информацию в файл HTML используя объекты контекста. И используя последний слой в HTML, я могу показать имя загруженного видеофайла после нажатия кнопки «Загрузить». Однако, поскольку объекты в views.py исчезли, у меня нет информации для сохранения данных. Есть ли способ сохранить информацию о видеофайле после нажатия кнопки «Обновить», что означает перезагрузку страницы? Или я могу отправить информацию из файла HTML в фон, как обратную версию контекста? Я попытался использовать запрос, но не смог получить доступ к информации. Кроме того, я также пытался использовать "сеанс", как в следующих блоках кода, для хранения информации. Однако это вызывает ошибку.

Сохранить информацию:

uploaded_file = request.FILES['videofile']
request.session['videofile'] = uploaded_file

Прочитать информацию:

uploaded_file = request.session["videofile"]
...