我有django服务器接收用户上传的文件,然后在本地存储元数据以便进一步检索,但是将文件发送到另一台服务器。所以我不希望文件存储在本地。这是我的初始模型:
class MainFile(models.Model):
owner = models.ForeignKey(User)
docfile = models.FileField(verbose_name= 'Enter you file', null=True)
file_id = models.TextField(max_length=38, null=True)
def __str__(self):
return MainFile.file_id
class MainFileForm(forms.ModelForm):
class Meta:
model = MainFile
fields = ['docfile']
我使用了instance.save('所有者',' file_id'),我收到错误:"无法在没有主键的情况下强制执行save()更新&# 34;所以我将模型改为以下:
class MainFile(models.Model):
owner = models.ForeignKey(User)
docfile = models.FileField(verbose_name= 'Enter you file', null=True)
file_id = models.TextField(max_length=38, primary_key=True, default=1)
更改模型后,我收到错误:"此模型中不存在以下字段,或者是m2m字段:file_id"
以及我的观点:
@login_required
def StoreSegments(request):
if request.method == 'POST':
form = MainFileForm(request.POST, request.FILES)
if form.is_valid():
file_id = uuid.uuid4()
instance = form.save(commit=False)
instance.owner = request.user
instance.file_id = file_id
instance.save(update_fields=['file_id', 'owner'])
f = request.FILES['docfile']
urls = 'http://192.168.43.6:8000/StoreSegments'
r=requests.post(urls, files= {'segment': f}, data={'segmentID':file_id})
form.save()
context = {'form': form, 'message': r.status_code}
return render(request, "StoreSegments.html", context)
form = MainFileForm()
return render(request, 'StoreSegments.html', context={'message': 'request.method =="get" detected',
'form': form})
那么,我怎样才能保存元数据并将文件发布出去?
答案 0 :(得分:0)
您不需要强制使用主键,只需附加用户对象即可。由于您不想在本地保存文件,因此您无需将其作为模型的一部分。
您确实希望用户上传文件,因此您确实需要将其作为表单的一部分。
第一步是从模型中删除文件字段,并将文件上传字段添加到表单。
我还建议您添加一些关于您的第三方处理的文件状态的元信息,但您可以稍后将其添加为增强功能。
使用原始模型,您只需要一个包含一个字段的普通表单:
class MainFile(models.Model):
owner = models.ForeignKey(User)
file_id = models.TextField(max_length=38, null=True)
def __str__(self):
return MainFile.file_id
class MainFileForm(forms.Form):
docfile = forms.FileField()
以下是更新视图的方法:
from django.contrib import messages
@login_required
def StoreSegments(request):
form = MainFileForm(request.POST or None, request.FILES or None)
if form.is_valid():
file_id = uuid.uuid4()
MainFile.objects.create(owner=request.owner, file_id=file_id)
f = request.FILES['docfile']
urls = 'http://192.168.43.6:8000/StoreSegments'
r=requests.post(urls, files= {'segment': f}, data={'segmentID':file_id})
messages.info(request, r.status_code)
return redirect("/thank-you") # You should always redirect after POST
return render(request,
'StoreSegments.html',
context={'message': 'request.method =="get" detected',
'form': form})
您应该在成功发布POST请求后重定向(有关详细信息,请参阅this article on wikipedia。)
查看messages framework以在感谢页面上显示生成的消息。