2011-05-09 12 views
16

Tengo formulario con un cuadro de texto y un archivo en django. Debe dejar que el uso pegue el texto en ese cuadro o cargue un archivo. Si el usuario ha pegado el texto en el cuadro, no es necesario que compruebe el archivoField.¿Cómo hacer que FileField en django sea opcional?

¿Cómo hago la forms.FileField() opcional?

Respuesta

37

Si estás utilizando un forms.FileField() en una clase derivada forms.Form, se puede establecer:

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

Si estás utilizando un models.FileField() y tienen un forms.ModelForm asignado a ese modelo, puede utilizar

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

cual se utiliza depende de cómo se está derivando la forma y si está utilizando el ORM subyacente (es decir, un modelo).

+0

Gracias! que resuelve mi problema :) – tamizhgeek

+5

que he leído en los lugares que no deben CharField's '' null = tienen true' ... ya que '' FileField's son esencialmente CharField's, ¿es realmente el camino a seguir? –

0

si usted quiere hacer esto antes de que el usuario envía el formulario que tendrá que hacerlo a través de Javascript (jQuery, Mootools, etc. todos ofrecen algunos métodos rápidos para eso)

en el lado Django que podría hacerlo en un método limpio en la forma. Esto debería ayudarlo a comenzar y deberá mostrar esos errores de validación en su plantilla para que el usuario pueda verlos. El nombre del método de limpieza debe coincidir con el nombre del campo de formulario con "limpiar_" antes.

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 

en la plantilla

{% if form.errors %} 
    {{form.non_field_errors}} 
    {% if not form.non_field_errors %} 
    {{form.errors}} 
    {% endif %} 
{% endif %} 
Cuestiones relacionadas