Skip to main content
 首页 » 编程设计

python之Django 文件上传 : filename not sticking

2024年09月03日31mengfanrong

我正在上传文件并将元数据存储在数据库中。部分元数据是文件名本身。然而,在线下的某个地方,文件名似乎没有被保存!为了简短起见,我将只粘贴我认为相关的代码部分。

class UploadFile(models.Model): 
   ... 
    theFile = models.FileField(upload_to = "Genius/Uploads/", null = True) 
    filename = models.CharField(max_length = 50, blank = True, null = False) 
 
class UploadFileForm(ModelForm): 
    class Meta: 
        model = UploadFile 
        fields = ('title', 'theFile', 'date_uploaded',) # Don't prompt for filename 
 
 
def files_upload(request): 
    if request.method == 'POST': 
        form = UploadFileForm(request.POST, request.FILES) 
        if form.is_valid(): 
            form.filename = request.FILES['theFile'].name # TODO: sanitize! 
            # form.filename = 'foo' 
            form.save() 
            return HttpResponseRedirect('/files/upload/successful/') 
        else: 
            form = UploadFileForm() 
        return render_to_response('files/upload_file.html', { 'form': form }) 

我在保存表单之前和之后检查了 request.FILES['theFile'].name 的值。无论出于何种原因,它都完好无损,但似乎从未进入数据库。

请您参考如下方法:

那是因为 form.filename 是表单字段,而不是它将要保存的值。

您正在寻找这样的东西:

class UploadFileForm(ModelForm): 
    def save(self, commit=True): 
        instance = ModelForm.save(self, commit=False) 
        instance.filename = self.files['theFile'].name 
 
        if commit: 
            instance.save() 
 
        return instance 
 
    class Meta: 
        model = UploadFile 
        fields = ('title', 'theFile', 'date_uploaded',) # Don't prompt for filename 

替代方案:

upload_file = form.save(commit=False) 
upload_file.filename = request.FILES['theFile'].name 
upload_file.save()