【问题标题】:How do I set a default file for `models.FileField()`?如何为“models.FileField()”设置默认文件?
【发布时间】:2020-09-17 10:00:41
【问题描述】:

如何为models.FileField() 设置默认文件?

class MyModel(models.Model):
    myfile = models.FileField(upload_to='mydocs', default=???)

答案似乎是:

myfile=models.FileField(upload_to='mydocs', default='mydocs/myfile.pdf')

但是,这不会在创建新对象时产生预期的行为。

而对于CharField 等其他字段,default= 值作为小部件值显示在新表单上。但是对于 FileField 它不是,它仍然导致“没有选择文件”:

那么如何设置默认值?我们应该尝试创建一个新的 FieldFile 实例吗?我们需要创建一个文件对象吗?

【问题讨论】:

  • 如果存储在mydocs中,默认应该是mydocs/myfile.pdf
  • 如果您不想在ModelForms 中将blank=True 设为默认值,您还应该设置它。
  • @WillemVanOnsem 谢谢,是的,它应该是'mydocs/myfile.pdf`,错字编辑
  • @WillemVanOnsem,我想加载myfile.pdf 作为表单中建议的初始文件对象(用户可以覆盖),所以blank=False, null=False 是否正确?
  • blank=True 表示用户不需要在表单中添加文件,而不是在空字符串上设置。所以 blank=True 但是null=False 是的。

标签: django django-models


【解决方案1】:

可能是您没有在 django 设置中定义默认的 MEDIA_ROOT。尝试这样定义:

def get_default(self):
    if self.myfile:
        return self.myfile
    else:
        return settings.MEDIA_ROOT + '/mydocs/myfile.pdf'

myfile=models.FileField(upload_to='mydocs', default=get_default)

在你的 settings.py 中,添加:

MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

在您的 urls.py 中,添加到末尾:

urlpatterns += static(settings.MEDIA_URL,
                      document_root=settings.MEDIA_ROOT)

【讨论】:

  • 谢谢,为什么你的默认属性中有settings.MEDIA_ROOT 作为字符串?如果文件是在保存时创建的,那么默认引用是有效的,不是吗?
  • 我已经编辑了代码,我希望它现在可以工作。 'get_default' 方法必须在你的模型类之外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多