2011-01-01 15 views
14

is_valid() en un formulario delimitado comprueba si se ingresan todos los datos requeridos. Esto no es lo que quiero. Quiero comprobar si cualquier campo se llenó en el formulario.Django: ¿Cómo comprobar si el usuario dejó todos los campos en blanco (o los valores iniciales)?

¿Alguna idea?

Elaboración:

Quiero dar al usuario la opción de no cumplimentar el formulario en absoluto. Sin embargo, si intentan completarlo (es decir: cambiaron un valor en un campo de su valor inicial, generalmente valor vacío), quiero validarlo.

La vista sería algo como esto:

def get_opinion(request): 

    if request.method == 'POST': 
     f = OpinionForm(request.POST) 
     if form_is_blank(f): 
      return HttpResponseRedirect(reverse('thank_you_anyway')) 
     elif f.is_valid(): 
      #Process here 
      return HttpResponseRedirect(reverse('thanks_for_participating')) 
    else: 
     initial = {'weekday': date.today().strftime('%A')} 
     f = OpinionForm(initial=initial) 

    return render_to_response(
     'get_opinion.html', 
     {'form': f,}, 
     RequestContext(request) 
    ) 

Lo que yo quiero es la parte form_is_blank().

+0

Debe poner más de un caso de uso distinto para esto. Si solo te importa tener al menos un campo rellenado, eso suena como algo que debería ocurrir en el lado del cliente con algo de javascript. –

+0

@Matt: Gracias por la sugerencia. Elaboré con algún código. –

Respuesta

22

Supongo que tengo que responder mi propia pregunta.

Al parecer, hay una función indocumentado Form: has_changed()

>>> f = MyForm({}) 
>>> f.has_changed() 
False 
>>> f = MyForm({}) 
>>> f.has_changed() 
False 
>>> f = MyForm({'name': 'test'}) 
>>> f.has_changed() 
True 
>>> f = MyForm({'name': 'test'}, initial={'name': 'test'}) 
>>> f.has_changed() 
False 

Así que esto haría muy bien como el reemplazo para form_is_blank() (revertido por supuesto).

+0

¿Qué sucede si quiere guardar el formulario si no está en blanco? El método 'has_changed' no ayudaría allí, ¿verdad? –

0

Si ha puesto required=True en su campo de formularios o en el modelo blank=False, entonces is_valid() debe devolver False.

3

Debe establecer obligatorio = Falso para todos los campos del formulario y anular el método clean para realizar una validación personalizada. Ver the current documentation para más.

+0

Para mi caso de uso particular, tengo múltiples formularios en la vista. Si el usuario comienza a completar uno de los formularios, entonces quiero que se requieran ciertos campos. – Bobort

4

para conseguir este trabajo funcionalidad para subconjunto de las formas utilizadas en el actual <forma> etiqueta también es necesario definir

class YourForm(forms.ModelForm): 
    def full_clean(self): 
     if not self.has_changed(): 
      self._errors = ErrorDict() 
      return 

     return super(YourForm, self).full_clean() 

por lo que cuando se solicita al usuario a corregir los errores de validación Eso no tiene errores de visualización de las formas que desea validar solo si algún valor no está en blanco (o predeterminado).

Cuestiones relacionadas