在保存文件之前将变量从视图传递到模型

时间:2014-04-22 00:47:33

标签: django django-models django-views

我希望在保存到磁盘之前重命名我的文件上传。我想用来设置名称的逻辑将包含在视图中。

我希望在保存之前将我的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

编辑:我修改了代码,以帮助我更清楚地解决问题。

2 个答案:

答案 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})

此视图会检查您的表单以确保其有效,然后保存上传的文件。假设您的DocumentFormname字段,则会先分配,这意味着您upload_to的功能将能够访问它。此视图的示例语言来自Django docs here

如果有效,请告诉我。

答案 1 :(得分:0)

如果我理解正确,你正在寻找类似的东西,

newdoc.instance.your_attribute = getname