如何使 django 中的 FileField 成为可选的?

Posted

技术标签:

【中文标题】如何使 django 中的 FileField 成为可选的?【英文标题】:How to make FileField in django optional? 【发布时间】:2011-08-21 20:52:59 【问题描述】:

我在 django 中有一个带有文本框和文件字段的表单。它应该允许用户将文本粘贴到该框中或上传文件。如果用户已将文本粘贴到框中,则无需检查 fileField。

如何使 forms.FileField() 可选?

【问题讨论】:

【参考方案1】:

如果您在forms.Form 派生类中使用forms.FileField(),您可以设置:

class form(forms.Form):
    file = forms.FileField(required=False)

如果您使用的是 models.FileField() 并为该模型分配了 forms.ModelForm,则可以使用

class amodel(models.Model):
    file = models.FileField(blank=True, null=True)

您使用哪一个取决于您如何派生表单以及您是否使用底层 ORM(即模型)。

【讨论】:

我在CharFields 不应该有null=True...的地方读到了,因为FileFields 本质上是CharFields,这真的是要走的路吗? 不要在FileFields 上做null=True。只需blank=True 就足够了。正如@DMactheDestroyer 所说,它存储为CharField,因此null=True 会混淆它(其他值将存储为NULL,其他值将存储为""(空字符串)。【参考方案2】:

如果您想在用户提交表单之前执行此操作,则需要使用 javascript(jquery、mootools 等都提供一些快速方法)

在 django 方面,您可以在表单中以干净的方法执行此操作。这应该可以帮助您入门,并且您需要在模板上显示这些验证错误以供用户查看。 clean 方法的名称必须与前面带有“clean_”的表单字段名称匹配。

def clean_textBoxFieldName(self):
  textInput = self.cleaned_data.get('textBoxFieldName')
  fileInput = self.cleaned_data.get('fileFieldName')

  if not textInput and not fileInput:
    raise ValidationError("You must use the file input box if not entering the full path.")
  return textInput  

def clean_fileFieldName(self):
  fileInput = self.cleaned_data.get('fileFieldName')
  textInput = self.cleaned_data.get('textBoxFieldName')
  if not fileInput and not textInput:
    raise ValidationError("You must provide the file input if not entering the full path")
  return fileInput

在模板上

% if form.errors %
  form.non_field_errors
  % if not form.non_field_errors %
    form.errors
  % endif %
% endif %

【讨论】:

以上是关于如何使 django 中的 FileField 成为可选的?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 NamedTemporaryFile 保存到 Django 中的模型 FileField 中?

如何更新/替换 Django FileField() 中的文件

如何在 Django 的 FileField 中保存来自传入电子邮件的附件?

在 Django 中保留 FileField 的原始文件名

Django - 如何设置 forms.FileField 名称

Django 模板视图 url 或 FileField