以Django表单提交后保留用户输入

时间:2020-06-16 23:54:01

标签: python django django-forms django-views django-templates

我正在尝试使用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"]

0 个答案:

没有答案