两个 Django 表单和两个 url 仅显示在一个表单中

问题描述 投票:0回答:1

一个 Django 表单正在处理 Excel 文件,而另一个表单正在处理视频文件。但视频文件表单从未显示出来...如果有人了解我的代码周围发生的情况,希望获得任何帮助

设置.py

# Media uploading
MEDIA_ROOT= os.path.join(BASE_DIR, '')
MEDIA_URL= "/"

当我运行本地主机并将 url 设置为媒体时,它恰好声称我的媒体不可用,所以我别无选择,只能将其 root 到根文件

url.py

from django.urls import path
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

import hello.views  

urlpatterns = [
    path("", hello.views.upload_file, name="index"),
    path("upVideo", hello.views.showVideo, name="videoUpload"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

模型.py

from django.db import models

class Document(models.Model):
    docfile = models.FileField()

class Video(models.Model):
    name= models.CharField(max_length=500)
    videoFile= models.FileField(upload_to='videos/', null=True, verbose_name="")
    videoFile= models.FileField(upload_to='somewhere/')

    def __str__(self):
        return self.name + ": " + str(self.videoFile)

表格.py

from django import forms
from .models import Video

class UploadFileForm(forms.Form):
    file = forms.FileField()

class VideoForm(forms.ModelForm):
    class Meta:
        model= Video
        fields= ["name", "videoFile"]

views.py

from django.shortcuts import render
from django import forms

from .models import Video
from .forms import UploadFileForm,VideoForm

#**************File Upload View****************#
def upload_file(request):
    if request.method == "POST":
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            extract = handle_uploaded_file(request.FILES['file'].file)
            return render (request, 'dataDisplay.html', {'data':extract})
    else:
        form = UploadFileForm()
    return render(request, "index.html",{"form": form})

#**************Video Upload View****************#
def showVideo(request):
    if request.method == "POST":
        lastVideo= Video.objects.last()
        videoFile= lastVideo.videoFile
        vForm= VideoForm(request.POST, request.FILES)
        context= {'videoFile': videoFile,
                'vForm': vForm
                }

        if vForm.is_valid():
            vForm.save()
            return render(request, 'index.html', context)
        else:
            vForm = VideoForm()
        return render(request, "index.html",{"vForm": vForm})

index.html

<form action="" enctype="multipart/form-data"  method="post" id="uploadingForm" target="_blank">
    {% csrf_token %}
    <span id="uploadedFile">{{ form }}</span>
    <input type="submit" value="Submit" id="uploadButton">
</form>

<div id="uploadSection2">
    <span>Option 3: Site Data</span>
    <h1>Video Uploader</h1>
    <form enctype="multipart/form-data" method="POST" action={% url 'videoUpload' %}>
        {% csrf_token %}
        {{ vForm.as_p }}
    <input type="submit" value="Upload" disabled> <!-- forcefully disabled until figured out how-->
    </form>
</div>

我已经进行了一些搜索,但仍然无法弄清楚发生了什么...仍然不知道为什么只有

vForm
永远不会出现...非常感谢任何帮助!

python html django django-views django-forms
1个回答
0
投票

在同一模板中处理两个不同的请求时,可以在模板中使用条件表达式。还处理视图方法中的错误。

views.py

def upload_file(request):
    if request.method == "POST":
        # handling POST request
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            extract = handle_uploaded_file(request.FILES['file'].file)
            return render(request, 'dataDisplay.html', {'data': extract})
        else:
            # if form is not valid render form with error
            return render(request, "index.html", {"form": form})
    else:
        # handling GET request to render form
        form = UploadFileForm()
    return render(request, "index.html", {"form": form})


#**************Video Upload View****************#
def showVideo(request):
    if request.method == "POST":
        # handling POST request
        lastVideo = Video.objects.last()
        videoFile = lastVideo.videoFile
        vForm = VideoForm(request.POST, request.FILES)
        context = {
            'videoFile': videoFile,
            'vForm': vForm
        }
        if vForm.is_valid():
            vForm.save()
            return render(request, 'index.html', context)
        else:
            # if form is not valid render form with error
            return render(request, "index.html", {"vForm": vForm})
    else:
        # handling GET request to render form
        vForm = VideoForm()
    return render(request, "index.html", {"vForm": vForm})

index.html

{% if form %}
    <form action="{% url 'index' %}" enctype="multipart/form-data"  method="post" id="uploadingForm" target="_blank" >
        {% csrf_token %}
        <span id="uploadedFile">{{ form }}</span>
        <input type="submit" value="Submit" id="uploadButton">
    </form>
{% endif %}

{% if vForm %}
    <div id="uploadSection2">
        <span>Option 3: Site Data</span>
        <h1>Video Uploader</h1>
        <form enctype="multipart/form-data" method="POST" action="{% url 'videoUpload' %}">
            {% csrf_token %}
            {{ vForm.as_p }}
        <input type="submit" value="Upload">
        </form>
    </div>
{% endif %}

确保

localhost:8000/
调用
upload_file()
方法并且
localhost:8000/upVideo
调用
showVideo()
方法。

© www.soinside.com 2019 - 2024. All rights reserved.