Tengo un informe web que usa un formulario Django (formularios nuevos) para los campos que controlan la consulta utilizada para generar el informe (fecha de inicio, fecha de finalización, ...). El problema que estoy teniendo es que la página debería funcionar utilizando los valores iniciales del formulario (sin consolidar), pero no puedo acceder al campo clean_data a menos que llame a is_valid(). Pero is_valid() siempre falla en formularios independientes.Cómo usar los valores del formulario desde un formulario independiente
Parece que los formularios de Django se diseñaron con el uso de datos de edición de modo que una forma independiente no es realmente útil para nada más que mostrar HTML.
Por ejemplo, si tengo:
if request.method == 'GET':
form = MyForm()
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
is_valid() fallará si se trata de un GET (ya que es sin consolidar), y si lo hago:
if request.method == 'GET':
form = MyForm()
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
la primera llamada a do_query desencadena excepciones en form.cleaned_data, que no es un campo válido porque is_valid() no se ha llamado. Parece como si tuviera que hacer algo como:
if request.method == 'GET':
form = MyForm()
do_query(form['start_date'].field.initial, form['end_date'].field.initial)
else:
form = MyForm(request.method.POST)
if form.is_valid():
do_query(form.cleaned_data['start_date'], form.cleaned_data['end_date'])
es decir, no hay una interfaz común para recuperar los valores de la forma entre una forma unida y uno no unido.
¿Alguien ve una manera más limpia de hacer esto?
Sí, pero los valores predeterminados no se definen con el formulario (como con initial = value en las declaraciones de campo). Si usa el formulario en varios lugares, tendrá que repetir sus valores predeterminados. – davidavr