Как переопределить FileField и автоматически удалить предыдущий файл в Django? - PullRequest
0 голосов
/ 11 мая 2011

я начинающий Джанго (Джанго 1.2.5) У меня есть эта модель:

class Document(models.Model):
    file = models.FileField(upload_to='documents/%Y/%m/%d', null=True, blank=True)
    title = models.CharField(max_length=30)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(User)
    #other fields
    #other fields

и модель для этого:

class DocumentForm(ModelForm):
    file = forms.FileField(required=True, error_messages={'required' : 'required!','empty': "empty!"})
    title = forms.CharField(widget = forms.TextInput(attrs={'size': 93,}), error_messages={'required': 'required!'})
   #other fields
   #other fields
    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

Я загружаю новые документы, используя DocumentForm выше, и это работает довольно красиво, но когда я пытаюсь отредактировать какой-то документ, я не могу поместить новый файл на место предыдущим. Я могу изменить все поля, кроме FileField.

def document_edit(request, document_id):
    doc = get_object_or_404(Document, id=document_id)
    form = DocumentForm(instance=doc)
    if doc.author == request.user:
        if request.method == "POST":
            form = DocumentForm(request.POST, request.FILES, instance=doc)
            if form.is_valid():
                if request.POST.get('cancel'):
                   return HttpResponseRedirect('/')
                elif request.POST.get('delete'):
                    document = Document.objects.get(id=document_id)
                    document.file.delete()
                    document.delete()
                    return HttpResponseRedirect('/')
                else:
                    form.save(author=request.user)
                return HttpResponseRedirect('/')
            else:
                # return again form with errors
        else:
            # return form with doc instance
    else:
        # return "you can't edit this doc!"

Я изучаю документацию по Django и знаю, что должен написать какой-то специальный метод сохранения в каком-то классе, но я совершенно не представляю, как мне это сделать. Это должен быть метод save () в Document () или в DocumentForm ()? Как правило, я хочу это: Когда я помещаю путь к новому файлу в форме, я хочу переопределить этот новый файл вместо него и автоматически удалить предыдущий файл.

Вы можете мне помочь? Заранее спасибо!

1 Ответ

0 голосов
/ 11 мая 2011

Вы на правильном пути, вы просто хотите использовать ключевое слово instance, поэтому ваша форма отражает редактируемый объект. Упрощенная версия:

def edit_upload(request, document_id):
    doc = get_object_or_404(Document, id=document_id)
    if request.method == 'POST': # If the form has been submitted...
        form = DocumentForm(request.POST, request.FILES, instance=doc)
        if form.is_valid(): # All validation rules pass
            if doc.file: # If document has file already...
                doc.file.delete() # delete it
            form.save() # Saves object, uses new uploaded file
            return redirect('/thanks/') # Redirect after success
    else:
        form = DocumentForm(instance=doc) # Show form to edit

    return render(request, 'edit.html', {
        'form': form,
    })
...