如何在django中使FileField可选?

时间:2011-05-09 17:22:24

标签: python django django-forms

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

如何制作forms.FileField()可选?

2 个答案:

答案 0 :(得分:42)

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

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(即模型)。

答案 1 :(得分:0)

如果你想在用户提交表单之前这样做,你需要使用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 %}