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()を3回使用します。上記のショートカットを1回使用してから、他のすべての場所で「doc」変数を使用してください

于 2011-05-09T20:03:48.627 に答える