2010-03-12 13 views
6

¿cómo puedo establecer el valor de un elemento de campo después de que se ha enviado un formulario pero no se ha validado? p.ej.Django Valor inicial del campo de formulario en la validación fallida

if form.is_valid(): 
    form.save() 
else: 
    form.data['my_field'] = 'some different data' 

No quiero realmente ponerlo en la vista y preferiría tenerlo como parte de la clase de formulario.

Gracias

Respuesta

5

que terminaron haciendo

if request.method == 'POST': 
    new_data = request.POST.copy() 
    form = MyForm(data=new_data) 
    if form.is_valid(): 
     form.save() 
    else: 
     new_data['myField'] = 'some different data' 

Espero que esto ayude a alguien

13

El documentation dice:

Si usted tiene una cota ejemplo Forma y desea cambiar los datos de alguna manera, o si desea vincular una instancia de Formulario independiente a algunos datos, cree otra instancia de formulario. No es forma de cambiar los datos en una instancia de formulario. Una vez que se haya creado una instancia de Formulario, debe considerar datos inmutables, ya sea que tenga datos o no.

Realmente no puedo creer que su código funcione. Pero está bien. Sobre la base de la documentación que haría de esta manera:

if request.method == 'POST': 
    data = request.POST.copy() 
    form = MyForm(data) 
    if form.is_valid(): 
     form.save() 
    else: 
     data['myField'] = 'some different data' 
     form = MyForm(initial=data) 
+3

Gran solución. Si también desea conservar los errores de la versión actualizada, puede usar 'new_form = MyForm (initial = data) new_form._errors = form._errors form = new_form' – Michael

0

usted puede ponerlo en la clase de formulario como el siguiente:

class MyForm(forms.Form): 

    MY_VALUE = 'SOMETHING' 
    myfield = forms.CharField(
     initial=MY_VALUE, 
     widget=forms.TextInput(attrs={'disabled': 'disabled'}) 

    def __init__(self, *args, **kwargs): 

     # If the form has been submitted, populate the disabled field 
     if 'data' in kwargs: 
      data = kwargs['data'].copy() 
      self.prefix = kwargs.get('prefix') 
      data[self.add_prefix('myfield')] = MY_VALUE 
      kwargs['data'] = data 

     super(MyForm, self).__init__(*args, **kwargs) 

La forma en que funciona, es que pone a prueba para ver si alguno de datos tiene pasado al constructor de formulario. Si lo tiene, lo copia (los datos no copiados son inmutables) y luego coloca el valor inicial antes de seguir creando la instancia del formulario.

Cuestiones relacionadas