Django 3. Удаление файла (приложения) при редактировании записи

Создаю некое подобие базы знаний документов, к которым прикрепляются приложения (файлы). Модель Документ:

class Document(models.Model):
    title = models.CharField(verbose_name="Заголовок", max_length=250)
    slug = models.SlugField("Ссылка", max_length=250, unique=True)
    user = models.ForeignKey(User, verbose_name="Пользователь", on_delete=models.CASCADE)
    category = models.ForeignKey(Category, verbose_name="Категория", related_name="categories", on_delete=models.CASCADE)
    text = models.TextField(verbose_name="Текст", blank=True, null=True)

Отдельно создал модель Файл:

class DocumentFile(models.Model):
    document = models.ForeignKey(Document, verbose_name="Документ", blank=True, null=True, on_delete=models.CASCADE)
    file = models.FileField(verbose_name="Вложения", blank=True, null=True, upload_to=file_directory_path)
 

Создание документа работает (правда файлы надо сразу добавлять пачкой, а не так, чтобы один файл добавил и появилась еще кнопка добавления файла, но не важно). Возникла проблема с редактированием созданного документа. Вьюха:

class DocumentUpdateView(UpdateView):
    model = Document
    template_name = 'base/viewdocument.html'
    form_class = DocumentForm
    extra_context = {'documents': Document.objects.all()}
    success_url = '/'
    template_name_suffix = '_update'
 
    def get_context_data(self, **kwargs):
        context = super(DocumentUpdateView, self).get_context_data(**kwargs)
        context['title'] = Document.objects.get(slug=self.kwargs['slug'])
        context['category'] = Category.objects.all()
        context['files'] = DocumentFile.objects.filter(document__slug=self.kwargs['slug'])
        return context

Вьюха удаления файла(скорее всего зря ее создал, хоть она и работает):

@login_required
def deletefile(request, pk):
    file = get_object_or_404(DocumentFile, pk=pk)
    slug = file.document.slug
    document = get_object_or_404(Document, slug=slug)
    if request.method == 'GET':
        file.delete()
        form = DocumentForm(instance=document)
        files = DocumentFile.objects.filter(document=document)
        return render(request, 'base/viewdocument.html', {
            'document': document,
            'files': files,
            'form': form
        })

Пути:

path('document/<str:slug>/view/', views.DocumentUpdateView.as_view(), name='viewdocument'),
path('deletefile/<int:pk>/', views.deletefile, name='deletefile'),

Шаблон:

{% extends 'base.html' %}
{% load static %}
{% block title %}
Редактирование документа {{document.title}}
{% endblock %}
{% block content %}
{{ error }}
{{category.title}}
<form method="POST" enctype="multipart/form-data" action="{% url 'viewdocument' document.slug %}">
    {% csrf_token %}
    {% comment %} {{form.as_p}}  /document/{{f.document.slug}}/view/
    {% endcomment %} 
 
    <div class="col-sm-8">Заголовок: <br>{{form.title}}  </div>
    <div class="col-sm-12">Категория:<br> {{form.category}}  </div>
    <div class="col-sm-8">Текст: <br> {{form.text}}  </div>
   
    <div class="col-sm-12">Приложения:<br>
        {% if files %}
        {% for f in files %}
        <div class="del-file" id="file_{{document.id}}_{{f.id}}">
           <p class="filelogo">
            <a class="text-decoration-none" href="{{f.file.url}}" download 
                style="color: #007c84;">
                {{ f.filename }} 
            </a>
            ({{f.file.size|filesizeformat }}) 
            <a  href="/deletefile/{{f.pk}}" class="btn" style="color: #162020;">Удалить файл </a>
            <br>
        </div> 
        {% endfor %} </div>  
         {% endif %}
         <br>
         <div class="col-sm-6">
         <input name="files" type="file" multiple class="form-control">  
      </div>
     <div class="description">Максимальный размер файла: <strong>50 МБ</strong>.<br>Разрешённые типы файлов: <strong>txt doc docx xls xlsx pdf png bmp jpg rar zip ppt pptx rtf gif</strong>.</div>
 
     {% for message in messages %}
 <span style="color:red;"> {{ message }} </span>
 {% endfor %}
     <button type="submit" class="btn btn-success">Сохранить</button>
 </form>
 <form method="POST" action="{% url 'deletedocument' document.slug %}">
     {% csrf_token %}
 <button type="submit"  class="btn btn-danger">Удалить документ</button>
 </form>
 {% endblock %}

Файлы удаляются в принципе, но удаляются безвозвратно, т.е. если я передумаю редактировать документ, файл уже не вернуть, так же при попытке добавить новые файлы ничего не происходит. Остальные элементы изменяются при сохранении. Так же при удалении происходит переход по ссылке /deletefile/{{f.pk}} (что не удивительно), а хотелось бы чтобы юрл не трогался. Думал применить ЖС, написал работающий скрипт удаления файлов, но при обновлении страницы они возвращаются, есть ли способ записать данные изменения в бд при сохранении? Не могу придумать, как исправить функционал удаления\добавления файлов.

Пишу тут, потому что не могу оставлять комментарии. Я бы на вашем месте написал простой js, который ждет нажатия на кнопку сохранить и после нажатия отправляется ajax запрос, который вы принимаете в обработчике

if request.headers.get('x-requested-with') == 'XMLHttpRequest':

и выполняете код удаления. В самом ajax можно передавать какой-либо ключ, чтоб не путать его с другими запросами, а также вам нужно будет передать на сервер тот файл, который в будущем нужно удалить. Для безопасности вам придется проверять право пользователя на удаление файла(если вообще это нужно), так же можно сделать свой редирект на нужную страницу в виде return redirect('куда') чтоб юрл не трогался

Вернуться на верх