我希望在保存到磁盘之前重命名我的文件上传。我想用来设置名称的逻辑将包含在视图中。
我希望在保存之前将我的getname变量从我的视图传递到我的模型类。这是我破碎的代码。
查看:
getname = 'foo' #I want this string to get passed into upload_to in the model
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
newdoc = Document()
newdoc.filename = getname #This line doesn't work
newdoc.docfile = request.FILES['docfile']
newdoc.save()
型号:
class Document(models.Model):
filename = ''
docfile = models.FileField(upload_to=filename)
我已阅读了其中几个链接,但每当我触摸我的代码时,我就会破坏它。
http://www.malloc.co/django/django-rename-a-file-uploaded-by-a-user-before-saving/ http://catherinetenajeros.blogspot.com/2013/03/rename-path-when-imagefile-upload.html
编辑:我修改了代码,以帮助我更清楚地解决问题。
答案 0 :(得分:2)
我认为这就是您想要的,假设您在视图中输入了getname
:
首先,你的模特:
def upload_function(instance, filename):
getname = instance.name
# Add other filename logic here
return customfilename # Return the end filename where you want it saved.
class Document(models.Model):
name = models.CharField(max_length=25)
docfile = models.FileField(upload_to=upload_function) # The upload_to argument sends it to your upload function.
在这种情况下,您需要创建自己的upload_to
功能(此处称为upload_function
)。你可以阅读here。运行此函数时,它会将实例作为第一个参数传递,因此您可以访问其属性。因此,我们在创建文件名时会访问name
。进一步解释here。
现在你的观点:
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import DocumentForm
from .models import Document
def upload_file(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
instance = Document(docfile=request.FILES['file'])
instance.save()
return HttpResponseRedirect('/success/url/')
else:
form = DocumentForm()
return render(request, 'upload.html', {'form': form})
此视图会检查您的表单以确保其有效,然后保存上传的文件。假设您的DocumentForm
有name
字段,则会先分配,这意味着您upload_to
的功能将能够访问它。此视图的示例语言来自Django docs here。
如果有效,请告诉我。
答案 1 :(得分:0)
如果我理解正确,你正在寻找类似的东西,
newdoc.instance.your_attribute = getname