【问题标题】:Django: Calling save() on FileField using field name as stringDjango:使用字段名称作为字符串在 FileField 上调用 save()
【发布时间】:2014-02-28 23:44:26
【问题描述】:

我是 Django 新手,并且已经阅读并尝试了我想到的所有内容。

我有一个基于模型的表单。该模型包含 3 个 FileField 字段:

img_big = models.FileField(upload_to='images/%Y/%m/b',max_length=100)
img_med = models.FileField(upload_to='images/%Y/%m/m',max_length=100)   
img_sml = models.FileField(upload_to='images/%Y/%m/s',max_length=100)

在我的代码中,我想遍历这些字段并将生成的文件保存到每个字段中。 'img' 是我们的文件,filename 是文件名。所以,这是有效的:

new_image.img_big.save(filename, img)

但我需要一个带有字段名的变量而不是img_big,例如:

new_image.variable.save(filename, img)
or 
new_image.'test_'+filename.save(filename, img)

我尝试使用 setattr(),但我不能或不知道如何使用它设置文件名,在这种情况下可能是不可能的。

new_image.__dict__['fieldname'].save(filename, img)

也不行。

【问题讨论】:

  • 你试过getattr吗? getattr(new_image, 'variable').save(...)
  • 哇,谢谢,它是这样工作的。你能解释一下它为什么起作用吗?在 python 文档中,它说 getattr 只返回一个值。它是 django 特有的吗?
  • @horbor,不,那是 python。您检索了一个名为“变量”的属性的值。 foo.bar = '你好'; getattr(foo, 'bar');
  • @Yuji'Tomita'Tomita 属性没有价值,所以我认为它不会返回不存在的东西。还是没搞清楚。
  • 这是因为 FileField 的魔法。 img_big 是一种句柄,允许您获取/设置此值。当你看到它是空的,但它允许你设置它。阅读有关 python 描述符的信息 :)。

标签: python django django-forms filefield setattr


【解决方案1】:

正如 Paulo Bu 所注意到的,正确的解决方案很简单,使用 getattr():

getattr(new_image, 'variable').save(...)

谢谢,成功了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 2013-09-30
    • 2021-11-02
    相关资源
    最近更新 更多