Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » удаление файлов при редактировании поля и удалении объекта [RSS Feed]

#1 Сен. 30, 2011 13:50:39

mc
От:
Зарегистрирован: 2011-09-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

удаление файлов при редактировании поля и удалении объекта

В модели есть поле типа ImageField, подскажите, плз, как сделать, чтобы при его редактировании и удалении объекта объекта, ненужны ранее закаченные файлы удалялись.



Офлайн

#2 Сен. 30, 2011 14:33:42

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

удаление файлов при редактировании поля и удалении объекта

mc
В модели есть поле типа ImageField, подскажите, плз, как сделать, чтобы при его редактировании и удалении объекта объекта, ненужны ранее закаченные файлы удалялись.
переопредели метод save() и delete() своей модели.



Офлайн

#3 Сен. 30, 2011 14:51:22

mc
От:
Зарегистрирован: 2011-09-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

удаление файлов при редактировании поля и удалении объекта

может есть где-нить пример чего то подобного?



Офлайн

#4 Сен. 30, 2011 15:14:08

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

удаление файлов при редактировании поля и удалении объекта

mc
может есть где-нить пример чего то подобного?
ну как то так(взято из моего тестового проекта):
# model.py
.....
from sorl.thumbnail import delete
from sorl.thumbnail.fields import ImageField
......

class Book(models.Model):
.....
cover = ImageField(......)
......

def is_empty_cover(self):
return True if self.cover else False

def save(self):
try:
old_book = Book.objects.get(id=self.id)
except Book.DoesNotExist:
pass
else:
if old_book.is_empty_cover() and old_book.cover != self.cover:
path_cover = os.path.join(settings.MEDIA_ROOT, '%s') % old_book.cover
if os.path.exists(path_cover):
delete(old_book.cover)
super(Book, self).save()

def delete(self):
try:
old_book = Book.objects.get(id=self.id)
except Book.DoesNotExist:
pass
else:
if old_book.is_empty_cover():
path_cover = os.path.join(settings.MEDIA_ROOT, '%s') % old_book.cover
if os.path.exists(path_cover):
delete(old_book.cover)
super(Book, self).delete()
P.S. Если будешь удалять отмечая чекбоксы слева в админке, то обрати внимание что удаление не будет работать для этого надо будет делать как то так:
# admin.py
....
class BookAdmin(admin.ModelAdmin):
.......
actions=['really_delete_selected']

def get_actions(self, request):
actions = super(BookAdmin, self).get_actions(request)
del actions['delete_selected']
return actions

def really_delete_selected(self, request, queryset):
for book in queryset:
book.delete()
self.message_user(request, u'успешно удалено книг: %s' % queryset.count())
really_delete_selected.short_description = u'удалить выбранные книги'
.....
подробнее вроде тут https://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/



Офлайн

#5 Окт. 7, 2011 13:50:01

mc
От:
Зарегистрирован: 2011-09-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

удаление файлов при редактировании поля и удалении объекта

спасибо. очень помогло. Код для удаления файлов после формы редактировани я решил сделать более универсальным, чтоб его не повторять в разных моделях и чтоб он не рос с увеличением кол-ва полей. Для этого запихнул его в родителя. Получилось так:

# coding: utf-8
from django.db import models
from django.db.models import Model
from django.conf import settings
import os
import shutil

class Project(Model):
img = ImageField(verbose_name=u'Изображение')

def save(self,*args, **kwargs):
#типы полей, даные которых удаляем при сохранении
fild_type = ['ImageField',]
class_child = self.__class__
fild_list = []
for i in self.__dict__:
if str(self.__dict__[i].__class__).replace('<class ', '').replace('>', '').replace("'", '').split('.')[-1] in fild_type:
fild_list.append(i)
try:
old_obj = class_child.objects.get(id=self.id)
except class_child.DoesNotExist:
pass
else:
for f in fild_list:
new = eval('self.' + f)
old = eval('old_obj.' + f)
if (old != new) and old:
path_del = (str(settings.MEDIA_ROOT) + str(old)).replace('\\','/')
if os.path.exists(path_del):
os.unlink(path_del)
else:
pass
super(Project, self).save(*args, **kwargs)


class Cottage(Project):
pass



Отредактировано (Окт. 7, 2011 13:59:10)

Офлайн

  • Начало
  • » Django
  • » удаление файлов при редактировании поля и удалении объекта[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version