如何删除使用django-ckeditor上传的图片?

dohp0rv5  于 2023-10-21  发布在  Go
关注(0)|答案(3)|浏览(158)

我在Django管理界面的CKEditor中上传了一些图片。我可以通过点击编辑器中的“图像”按钮来浏览和选择图像,然后在弹出的窗口中点击“浏览服务器”。以下是弹出窗口的屏幕截图:

我的问题是:如何删除服务器上的图像?

kmynzznz

kmynzznz1#

不幸的是,这是事实。Django-ckeditor并没有为这个问题提供任何内置的解决方案。有关上传文件的信息不会存储在任何地方。
如果你想留住他们-你必须自己去做!
使用覆盖的 delete 方法创建适当的数据模型(或者使用任何可以为您处理文件删除的现成“智能字段”,Django delete FileField):

  1. from django.db import models
  2. class UploadedFile(models.Model):
  3. uploaded_file = models.FileField(upload_to=u"storage/")
  4. uploaded_at = models.DateField(editable=False, auto_now_add=True)
  5. def __str__(self):
  6. return os.path.basename(self.uploaded_file.path)
  7. def url(self):
  8. return self.uploaded_file.url
  9. def delete(self, *args, **kwargs):
  10. file_storage, file_path = self.uploaded_file.storage, self.uploaded_file.path
  11. super(UploadedFile, self).delete(*args, **kwargs)
  12. file_storage.delete(file_path)

提供您自己的“upload”(和可选的“browse”)视图的实现,它将用于记住交易:

  1. from django.conf import settings
  2. from django.contrib.admin.views.decorators import staff_member_required
  3. from django.views.decorators.cache import never_cache
  4. from django.views.decorators.csrf import csrf_exempt
  5. from ckeditor_uploader.views import upload, browse
  6. from .models import UploadedFile
  7. import re
  8. @staff_member_required
  9. @csrf_exempt
  10. def ckeditor_upload_wrapper(request, *args, **kwargs):
  11. response = upload(request, *args, **kwargs)
  12. if b"Invalid" not in response.content:
  13. try:
  14. matched_regex = re.search("callFunction\(\d, '(.*)'\);", str(response.content))
  15. file_location = matched_regex.group(1).lstrip(settings.MEDIA_URL)
  16. UploadedFile(uploaded_file=file_location).save()
  17. except Exception:
  18. pass
  19. return response
  20. @staff_member_required
  21. @csrf_exempt
  22. @never_cache
  23. def ckeditor_browse_wrapper(request, *args, **kwargs):
  24. return browse(request, *args, **kwargs)

更改urls.py中的默认重定向:

  1. ...
  2. from app.views import ckeditor_upload_wrapper, ckeditor_browse_wrapper
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. #url(r'^ckeditor/', include('ckeditor_uploader.urls')),
  6. url(r'^ckeditor/upload/', ckeditor_upload_wrapper, name='ckeditor_upload'),
  7. url(r'^ckeditor/browse/', ckeditor_browse_wrapper, name='ckeditor_browse'),
  8. ...
  9. ]

就这样现在如果你注册了新的扩展文件模型,你就可以直接在Django管理面板中浏览,搜索和删除上传的图片。
(This解决方案已在 Django 1.10 上实现,扩展名为 django-ckeditor 5.3

展开查看全部
kqqjbcuj

kqqjbcuj2#

我担心这是不可能与ckeditor(至少我没有看到这样的功能开箱即用)。
您可以使用Django文件管理器
https://www.djangopackages.com/grids/g/file-managers/
例如,django-filebrowser

31moq8wy

31moq8wy3#

我正在使用此解决方案

  1. class Post(TimeStampedModel):
  2. title = models.CharField('titulo', max_length=255)
  3. slug = models.SlugField(max_length=255, blank=True, unique=True)
  4. author = models.ForeignKey(User,
  5. on_delete=models.SET_NULL,
  6. blank=True,
  7. null=True)
  8. content = RichTextUploadingField('conteudo', blank=True, null=True)
  9. post_date = models.DateField('data', blank=True, null=True)
  10. obs = models.CharField('obs', max_length=255, blank=True, null=True)
  11. def __str__(self):
  12. return self.title
  13. class Meta:
  14. ordering = ['-post_date']
  15. verbose_name = 'notícia'
  16. verbose_name_plural = 'notícias'
  17. def get_absolute_url(self):
  18. return resolve_url('core:post_detail', slug=self.slug)
  19. def get_exter_url(self):
  20. return resolve_url('external:post_detail', slug=self.slug)
  21. def get_firt_img(self):
  22. soup = BeautifulSoup(self.content, "html.parser")
  23. imgs = soup.find_all("img")
  24. return imgs[0]['src'] if len(imgs) > 0 else ''
  25. def get_link_imgs(self):
  26. soup = BeautifulSoup(self.content, "html.parser")
  27. imgs = soup.find_all("img")
  28. list_img = []
  29. for element in imgs:
  30. list_img.append(element['src'])
  31. return list_img
  32. def save(self, *args, **kwargs):
  33. if not self.slug:
  34. unique_slugify(self, self.title, slug_field_name='slug')
  35. super(Post, self).save(*args, **kwargs)
  36. # signal Post
  37. @receiver(post_delete, sender=Post)
  38. def remov_to_imgs(sender, instance, **kwargs):
  39. for img in instance.get_link_imgs():
  40. _file = urllib.parse.unquote(str(settings.BASE_DIR)+img)
  41. # get thumb the img
  42. ext = '.'+''.join(_file.split('.')[-1])
  43. thumb = _file[:-len(ext)]+'_thumb'+ext
  44. exists = os.path.isfile(_file)
  45. if exists:
  46. if not Post.objects.filter(content__icontains=img).exclude(
  47. pk=instance.pk).exists():
  48. os.remove(_file)
  49. # thumb img
  50. if os.path.isfile(thumb):
  51. os.remove(thumb)
展开查看全部

相关问题