当前位置: 首页 > 面试题库 >

使用当前模型ID的Django管理文件上传

贺宏富
2023-03-14
问题内容

我正在尝试使用默认的Django admin创建一个简单的照片库。我想为每个画廊保存一张样本照片,但我不想保留filname。除了文件名,我想保存模型的ID(N.jpg)。但是,第一次我要保存该对象时,该ID不存在。我如何知道模型中的下一个自动增量,或者以某种方式保存模型数据(在存在super.save文件时上传之前和之后)self.id?有没有很酷的解决方案?

像这样:

def upload_path_handler(instance, filename):
    ext = filename extension
    return "site_media/images/gallery/{id}.{ext}".format(id=instance.nextincrement, ext=ext)

class Gallery(models.Model):
    name  = models.TextField()
    image = models.FileField(upload_to=upload_path_handler)

也许将文件名存储在其他字段中。


问题答案:

图像文件将在Gallery实例之前保存。因此,您必须通过使用带有状态的Gallery实例本身的信号将保存分为两个阶段:

from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver

_UNSAVED_FILEFIELD = 'unsaved_filefield'

@receiver(pre_save, sender=Image)
def skip_saving_file(sender, instance, **kwargs):
    if not instance.pk and not hasattr(instance, _UNSAVED_FILEFIELD):
        setattr(instance, _UNSAVED_FILEFIELD, instance.image)
        instance.image = None

@receiver(post_save, sender=Image)
def save_file(sender, instance, created, **kwargs):
    if created and hasattr(instance, _UNSAVED_FILEFIELD):
        instance.image = getattr(instance, _UNSAVED_FILEFIELD)
        instance.save()        
        # delete it if you feel uncomfortable...
        # instance.__dict__.pop(_UNSAVED_FILEFIELD)

upload_path_handler看起来像

def upload_path_handler(instance, filename):
    import os.path
    fn, ext = os.path.splitext(filename)
    return "site_media/images/gallery/{id}{ext}".format(id=instance.pk, ext=ext)

如果字段仅用于图像上传,我建议使用ImageField而不是FileField进行类型检查。另外,您可能希望规范化文件名扩展名(由于mimetype而不需要),例如

def normalize_ext(image_field):
    try:
        from PIL import Image
    except ImportError:
        import Image
    ext = Image.open(image_field).format
    if hasattr(image_field, 'seek') and callable(image_field.seek):
       image_field.seek(0)
    ext = ext.lower()
    if ext == 'jpeg':
        ext = 'jpg'
    return '.' + ext


 类似资料:
  • 问题内容: 我有一个领域模型: 在我的管理员中: 在这里,我不想在添加MyModel时在管理员中使用。我希望将其设置为当前用户,例如 我怎样才能做到这一点? 谢谢 问题答案: 您已经设置好了,因此它不会以Django管理员的形式出现。 现在,您需要覆盖,并在保存新对象之前设置用户。

  • 问题内容: 我为Django模型创建了一个自定义管理器,该管理器返回一个包含Objects.all()子集的QuerySet。我需要将其作为模型的默认管理器,因为我还将创建一个自定义标签,该标签将从任何模型(由参数指定)中检索内容,并且需要对指定模型使用默认管理器。一切正常,除了- Django Admin还使用此特定模型的默认管理器,这意味着并非所有模型实例都出现在admin中。 Django文

  • 问题内容: 在要显示已注册模型的管理站点的根页面上,我想隐藏已注册到Django admin的多个模型。 如果我直接注销这些记录,由于添加新符号“ +”消失了,因此我无法添加新记录。 如何才能做到这一点 ? 问题答案: 基于x0nix的答案,我做了一些实验。似乎从返回空会将模型从index.html中排除,同时仍然允许你直接编辑实例。

  • X1.4.0新增 sp_get_current_admin_id() 功能: 获取当前登录管理员id,同get_current_admin_id() 参数: 无 返回: 类型int,管理员的id

  • 问题内容: 如何在管理界面中将模型完全设为只读?它用于一种日志表,我在其中使用管理功能来搜索,排序,过滤等,但无需修改日志。 万一这看起来像是重复的,这不是我想要做的: 我不是在寻找只读字段(即使将每个字段都设为只读也可以让你创建新记录) 我不是要创建一个只读用户:每个用户都应该是只读的。 问题答案: templates / admin / view.html templates / admin

  • 问题内容: 我有一个可以让人们上传文件的应用程序,表示为。但是,我要确保用户仅上传xml文件。我知道我可以使用进行此操作,但是我不知道将检查放在何处-据我所知,clean由于文件在clean运行时尚未上传,因此无法将其放在函数中。 这是模型: 问题答案: 对于后代:解决方案是使用read方法并将其传递给。