我查看了文档编辑:
@login_required
def document_edit(request, doc_id):
try:
doc = Document.objects.get(id=doc_id)
except Document.DoesNotExist:
raise Http404
form = DocumentForm(instance=doc)
if request.method == "POST":
form = DocumentForm(request.POST, request.FILES, instance=doc)
if form.is_valid():
if request.POST.get('cancel'):
return HttpResponseRedirect('/')
if request.POST.get('delete'):
document = Document.objects.get(id=doc_id)
document.file.delete()
document.delete()
return HttpResponseRedirect('/')
else:
form.save(author=request.user)
text = "Document edited!"
return render_to_response('message.html', {'text' : text}, context_instance = RequestContext(request))
else:
return render_to_response('document_edit.html', {'form':form,}, context_instance = RequestContext(request))
else:
form = DocumentForm(instance=Document.objects.get(id=doc_id))
return render_to_response('document_edit.html', {'form':form, 'doc':doc,}, context_instance = RequestContext(request))
和forms.py中的此表单:
class DocumentForm(ModelForm):
file = forms.FileField(label = 'file', required=True, error_messages={'required' : 'required!','empty': "this file is empty!"})
title = forms.CharField(label = 'title', widget = forms.TextInput(attrs={'size': 93,}), error_messages={'required': 'required!'})
description = forms.CharField(label = 'description', widget = forms.Textarea(attrs={'rows': 10, 'cols': 120,}), error_messages={'required': 'required!'})
editable = forms.BooleanField(label='Document editable?', widget=forms.RadioSelect(choices=YES_OR_NO), required=False, initial=True)
class Meta:
model = Document
exclude = ('author',)
def save(self, author, commit=True):
document=ModelForm.save(self,commit=False)
document.author = author
if commit:
document.save()
return document
现在我想要覆盖现有文件(并自动删除以前的文件)。我怎么能这样做?
答案 0 :(得分:0)
如果我理解正确,您希望替换文档模型的“文件”字段(FileField数据类型)中的任何先前文件。如果您使用表单上传新文件,这将自动发生。你看到不同的行为吗?
自动删除以前的文件取决于您使用的Django版本。从1.3(目前是最新的)FileField开始,不会删除任何文件(changelog)。在1.2及更早版本中,FileField将在更改和删除时从文件系统中删除该文件。因此,如果您在1.2中更改或删除Model实例,文件就会消失。在1.3下,文件保持不变。
通过致电doc.file.delete()
,您正在做正确的事。但是,如果对模型实例执行任何类型的批量操作,这将是不够的。要在1.3中测试,请使用AdminSite选择多个记录并选择删除下拉列表。记录将消失,文件仍然存在。这些批量QuerySet操作和跳过自定义document_edit()函数的任何删除操作都将留下文件。最好的办法是为所有FileField数据类型编写一个删除函数,并用pre/post_delete signal附加它。如果您需要帮助,我建议新的SO问题。
其他事项:您可以使用此快捷键功能整理代码
from django.shortcuts import get_object_or_404
doc = get_object_or_404(Document, id=doc_id)
您在发布的代码中使用了Document.objects.get()三次。只需使用上面的快捷方式一次,然后在所有其他位置使用'doc'变量