Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
9 / 10 / 4
Регистрация: 14.06.2011
Сообщений: 114

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

25.05.2022, 14:34. Показов 426. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Создаю некое подобие базы знаний документов, к которым прикрепляются приложения (файлы).
Модель Документ:
Python
1
2
3
4
5
6
7
8
9
10
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)
Отдельно создал модель Файл:
Python
1
2
3
4
5
6
7
8
9
10
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)
 
    @property
    def filename(self):
        return os.path.basename(self.file.name)
Создание документа работает (правда файлы надо сразу добавлять пачкой, а не так, чтобы один файл добавил и появилась еще кнопка добавления файла, но не важно).
Возникла проблема с редактированием созданного документа.
Вьюха:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
Шаблон:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{% 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>
 
 <p>
 <form method="POST" action="{% url 'deletedocument' document.slug %}">
     {% csrf_token %}
 <button type="submit"  class="btn btn-danger">Удалить документ</button>
 </form>
 
 {% endblock %}
Вьюха удаления файла:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@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
        })
Пути:
Python
1
2
3
4
5
     path('document/<str:slug>/view/',
         views.DocumentUpdateView.as_view(), name='viewdocument'),
      path('deletefile/<int:pk>/',
         views.deletefile,
         name='deletefile'),
Файлы удаляются в принципе, но удаляются безвозвратно, т.е. если я передумаю редактировать документ, файл уже не вернуть, так же при попытке добавить новые файлы ничего не происходит. Остальные элементы изменяются при сохранении.
Так же при удалении происходит перекход по ссылке /deletefile/{{f.pk}} (что не удивительно), а хотелось бы чтобы юрл не трогался. Думал применить ЖС, написал работающий скрипт удаления файлов, но при обновлении страницы они возвращаются, есть ли способ записать данные изменения в бд при сохранении?
Не могу придумать, как исправить функционал удаления\добавления файлов.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.05.2022, 14:34
Ответы с готовыми решениями:

Дублируются записи при редактировании
&lt;?php require_once 'connect.php'; // подключаем скрипт //добавить запись-------------------------------- if(isset($_POST)...

Не обновляются записи при редактировании(((
Здраствуйте) У меня еще одна проблема- надеюсь последняя... Почему-то не редактируются записи... Редактирование работает по такому...

Ошибка при редактировании записи
Здравствуйте, у меня такая проблема при редактировании записи добавляется та же редактируемая строка, но не отредактированная и уже...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2022, 14:34
Помогаю со студенческими работами здесь

Проверка наличия записи при редактировании
Помогите новичку решить следующую задачу: При редактировании записи требуется проверить существует ли значение определённого поля в...

Ошибка при редактировании записи в таблице
echo ' &lt;form method=&quot;post&quot;&gt; &lt;input type=&quot;text&quot; name=&quot;color&quot; value=&quot;red&quot; /&gt; &lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;Изменить цвет&quot;...

DBGrid фокус записи при редактировании
Как запретить при редактировании записи, переходить на другую пока эту не сохранят. То есть чтобы он не смогу начать редактировать...

Ошибка при редактировании записи в StringGrid и очереди
Смысл такой. Редактируя данные в StringGrid мы применяем, после чего заносим данные из StringGrid-а в обнуленную очередь. Редактирование...

Убрать панель с названием приложения при редактировании лаяута
Подскажите как можно избавится от bar-а где написано название приложения именно при редактировании лаяута. Так как если использовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru