Django direct_cloud_upload 没有提交文件。检查表单上的编码类型
Django direct_cloud_upload No file was submitted. Check the encoding type on the form
我正在尝试使用库 direct_cloud_upload 将文件直接上传到 Google Cloud Storage Bucket 而无需通过我的 cloud运行(绕过 32Mb 请求限制)。
不幸的是,我一直遇到这个错误:没有提交文件。检查表单上的编码类型。 当我尝试上传文件时,在管理员字体上,即使文件已成功上传到存储。
显然我遗漏了什么,这是我的代码:
models.py
class AudioFileModel(models.Model):
title = models.CharField(max_length=80)
audio_file = models.FileField(upload_to='audio/')
class Meta:
ordering = ['title']
def __str__(self):
return f"{self.title}"
forms.py
from .models import AudioFileModel
from django import forms
from google.cloud.storage import Client
import direct_cloud_upload
import os
from direct_cloud_upload import CloudFileWidget
from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file(
'service-account-key.json'
)
client = Client(credentials=credentials)
gcs_bucket = client.get_bucket(os.environ.get("GS_BUCKET_NAME"))
ddcu_bucket_identifier = direct_cloud_upload.register_gcs_bucket(gcs_bucket)
class UploadAudioFileForm(forms.ModelForm):
class Meta:
model = AudioFileModel
fields = ('title', 'audio_file')
widgets = {
'audio_file': CloudFileWidget(
bucket_identifier=ddcu_bucket_identifier,
path_prefix="audio_file_new/",
)
}
}
urls.py
from .views import *
import direct_cloud_upload
urlpatterns = [
path("admin/", admin.site.urls),
path('upload_audio_file.html', AudioFileUploadView, name='AudioFileUploadView'),
path('direct_cloud_upload/', include(direct_cloud_upload.urlpatterns)),
]
views.py
from .forms import UploadAudioFileForm
from django.http import HttpResponse
def AudioFileUploadView(request):
if request.method == 'POST':
form = UploadAudioFileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponse('The file is saved')
else:
form = UploadAudioFileForm()
context = {
'form': form,
}
return render(request, 'upload_audio_file.html', context)
我在云端没有错误运行 bug,我认为这是一个前端bug。
我使用 python 3.8.6 和 django 3.1.6
事实证明模型中的字段应该是 CharField。
models.py
class AudioFileModel(models.Model):
title = models.CharField(max_length=80)
audio_file = models.CharField(max_length=160)
class Meta:
ordering = ['title']
def __str__(self):
return f"{self.title}"
我正在尝试使用库 direct_cloud_upload 将文件直接上传到 Google Cloud Storage Bucket 而无需通过我的 cloud运行(绕过 32Mb 请求限制)。
不幸的是,我一直遇到这个错误:没有提交文件。检查表单上的编码类型。 当我尝试上传文件时,在管理员字体上,即使文件已成功上传到存储。
显然我遗漏了什么,这是我的代码:
models.py
class AudioFileModel(models.Model):
title = models.CharField(max_length=80)
audio_file = models.FileField(upload_to='audio/')
class Meta:
ordering = ['title']
def __str__(self):
return f"{self.title}"
forms.py
from .models import AudioFileModel
from django import forms
from google.cloud.storage import Client
import direct_cloud_upload
import os
from direct_cloud_upload import CloudFileWidget
from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file(
'service-account-key.json'
)
client = Client(credentials=credentials)
gcs_bucket = client.get_bucket(os.environ.get("GS_BUCKET_NAME"))
ddcu_bucket_identifier = direct_cloud_upload.register_gcs_bucket(gcs_bucket)
class UploadAudioFileForm(forms.ModelForm):
class Meta:
model = AudioFileModel
fields = ('title', 'audio_file')
widgets = {
'audio_file': CloudFileWidget(
bucket_identifier=ddcu_bucket_identifier,
path_prefix="audio_file_new/",
)
}
}
urls.py
from .views import *
import direct_cloud_upload
urlpatterns = [
path("admin/", admin.site.urls),
path('upload_audio_file.html', AudioFileUploadView, name='AudioFileUploadView'),
path('direct_cloud_upload/', include(direct_cloud_upload.urlpatterns)),
]
views.py
from .forms import UploadAudioFileForm
from django.http import HttpResponse
def AudioFileUploadView(request):
if request.method == 'POST':
form = UploadAudioFileForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponse('The file is saved')
else:
form = UploadAudioFileForm()
context = {
'form': form,
}
return render(request, 'upload_audio_file.html', context)
我在云端没有错误运行 bug,我认为这是一个前端bug。
我使用 python 3.8.6 和 django 3.1.6
事实证明模型中的字段应该是 CharField。
models.py
class AudioFileModel(models.Model):
title = models.CharField(max_length=80)
audio_file = models.CharField(max_length=160)
class Meta:
ordering = ['title']
def __str__(self):
return f"{self.title}"