Форум сайта python.su
В модели есть поле типа ImageField, подскажите, плз, как сделать, чтобы при его редактировании и удалении объекта объекта, ненужны ранее закаченные файлы удалялись.
Офлайн
mcпереопредели метод save() и delete() своей модели.
В модели есть поле типа ImageField, подскажите, плз, как сделать, чтобы при его редактировании и удалении объекта объекта, ненужны ранее закаченные файлы удалялись.
Офлайн
может есть где-нить пример чего то подобного?
Офлайн
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()
# 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'удалить выбранные книги'
.....
Офлайн
спасибо. очень помогло. Код для удаления файлов после формы редактировани я решил сделать более универсальным, чтоб его не повторять в разных моделях и чтоб он не рос с увеличением кол-ва полей. Для этого запихнул его в родителя. Получилось так:
# 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)
Офлайн