0

我可以查看文档编辑:

@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

现在我希望有可能覆盖现有文件(并自动删除以前的文件)。我怎样才能做到这一点?

4

1 回答 1

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 信号。如果您需要这方面的帮助,我建议您提出一个新的 SO 问题。

其他事情:你可以用这个快捷功能来整理你的代码

from django.shortcuts import get_object_or_404
doc = get_object_or_404(Document, id=doc_id)

您在发布的代码中使用了 Document.objects.get() 三次。只需使用上述快捷方式一次,然后在所有其他位置使用“doc”变量

于 2011-05-09T20:03:48.627 回答