【问题标题】:Django FileField: how to set default value (auto-create empty file)?Django FileField:如何设置默认值(自动创建空文件)?
【发布时间】:2010-07-11 18:03:37
【问题描述】:

我有一个这样的模型:

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    code = models.FileField()

当一个新的 MyModel 被提交时,我想允许 code 字段为空,在这种情况下我需要 Django 创建一个空文件(具有任意名称)。

问题是:正确的方法是什么?

我在文档中找不到任何相关内容,因此在将 request.FILES 提供给 MyModelForm() 之前,我一直在查看手动编辑它,但这对我来说似乎是一个肮脏的 hack……有什么想法吗?

谢谢。

【问题讨论】:

  • 您打算如何使用提交到代码字段的值? FileField 听起来不太合适。
  • 这是一个包含 Python 代码的文件,然后在安全的运行时环境中执行。它需要先进行预编译,因此将其放在单独的文件中看起来最方便。
  • 坦率地说,想到这一点让我感到很沮丧。这是一个巨大的安全漏洞。
  • 我欢迎任何其他关于如何安全地执行不受信任的代码(由站点用户提供)的想法?

标签: python django django-forms filefield autocreate


【解决方案1】:

我会将输入的代码存储在 CharField 中,然后创建一个单独的函数来访问模型,如果代码不包含任何有害方法,则将其写入文件。

这将负责创建文件(因为空白 CharField 将简单地输出到空文件)并允许委托给安全检查器。您的设置将如下所示: 型号:

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    code = models.CharField(MAX_FILE_LENGTH)

查看:

def Submit_Code(request):
     #Create MyModel using POST data
     process_input_file(NEWLY_CREATED_MODEL_NAME)
     return HttpResponse("Upload Successful")

def process_input_file(modelName):
     #assuming unique name. Use "id=" instead if needed.
     mm = MyModel.objects.get(name=modelName)
     if passes_security_checks(mm.code):
          f = open(mm.name, "r")
          f.write(mm.code)
          f.close()

编辑 新观点:

def Submit_Code(request):
     mm = MyModel()
     mm.name = request.POST.get('name')
     f = open(mm.name,"r")
     f.write(request.POST.get('code')
     f.close()
     #then associate the newly created file with the FileField however you want
     #passing through authentication/checking if need be.
     return HttpResponse("Upload Successful")

【讨论】:

  • 我会将 process_input_file 代码放在表单的 clean_code 方法中,这样可以在一个地方处理所有表单的逻辑。
  • 我认为code字段应该是TextField而不是CharField。我相信 CharField 在 MySQL 中被实现为 VARCHAR(255),我想您希望能够拥有超过 255 个字符的代码。
  • 这是个好主意,但在 CharField 中重复数据对我来说似乎有点矫枉过正。目前,无论如何都在检查提交的代码,所以我没有看到单独存储它的理由。我已经实现了所有的东西,我只想让用户省略代码字段,然后在浏览器中编辑它。安全运行时完全从 Django 实例中抽象出来,并且无法访问数据库或任何东西。因此,将代码放在文件中是迄今为止最好的方法。最后,为了这里的其他人,很高兴知道正确的解决方案。
  • 澄清一下,您是从 POST 数据中获取代码吗?如果是这样,请参阅我的编辑:)
  • 请注意,我的示例不适合生产(如,没有错误检查)。
【解决方案2】:

只需将该字段设置为允许 null 和空白。这将使该字段成为可选字段。

code = models.FileField(null=True, blank=True)

【讨论】:

  • 我不认为这会创建所需的空文件。
猜你喜欢
  • 2011-10-08
  • 2020-03-03
  • 2011-05-15
  • 1970-01-01
  • 2017-07-24
  • 2011-08-01
  • 1970-01-01
  • 2017-05-17
相关资源
最近更新 更多