many formmodel form fields create validation django-forms

validation - formmodel - Formularios Django-Procesamiento de solicitudes GET



django formset (4)

Tenemos un formulario existente de Django que acepta solicitudes GET para permitir a los usuarios marcar sus parámetros de consulta resultantes. El formulario contiene muchos campos, la mayoría de los cuales son obligatorios. El formulario usa un texto estándar semi-estándar para manejar la solicitud, sustituyendo GET por POST:

if request.method == ''GET'': form = myForm(request.GET) if form.isValid() # Gather fields together into query. else form = myForm()

El problema es que la primera vez que se carga el formulario, no hay nada en la solicitud GET para rellenar los campos requeridos, por lo que la mayor parte del formulario se ilumina con errores de "campo faltante".

Establecer los valores iniciales no funciona; aparentemente, los valores inexistentes en la solicitud GET los anulan.

¿Cómo podemos evitar esto? Estoy bastante seguro de que simplemente no estamos procesando las cosas correctamente, pero no puedo encontrar un ejemplo de un formulario que maneje las solicitudes GET. Queremos que aparezcan errores si el usuario pulsa el botón "Enviar" mientras los campos están en blanco o no son válidos, pero no desea que aparezcan estos errores cuando se muestra el formulario inicialmente.


El argumento posicional de la subclase forms.Form le informa a Django que tiene la intención de procesar un formulario en lugar de simplemente mostrar un formulario en blanco / predeterminado. Tu if request.method == ''GET'' no está haciendo la distinción que deseas porque las solicitudes web viejas y regulares escribiendo una URL en un navegador web o haciendo clic en un enlace también son solicitudes GET , entonces request.method es igual a GET camino.

Necesita algún mecanismo diferenciador para que pueda distinguir entre una pantalla de formulario y un proceso de formulario.

Ideas:

Si su procesamiento se realiza a través de. AJAX, podrías usar if request.is_ajax() como tu condicional.

Alternativamente, podría incluir un token GET que indique que la solicitud se está procesando. En este ejemplo, primero necesitarías algo en tu forma:

<input type="hidden" name="action" value="process_form" />

Y luego puedes buscar ese valor en tu vista:

if ''action'' in request.GET and request.GET[''action''] == ''process_form'': form = myForm(request.GET) if form.is_valid(): # form processing code else: form = myForm()

También te daré el punto estándar y repetitivo de que generalmente es preferible no usar GET para el procesamiento de formularios si puedes evitarlo (precisamente porque te encuentras en dificultades como esta ya que estás usando un patrón anómalo), pero si tienes un caso de uso donde realmente lo necesita, entonces realmente lo necesita. Conoces tus necesidades mejor que yo. :-)


Mi primera pregunta es esta, que publiqué como comentario: ¿por qué no usar request.POST y la forma estándar de procesar datos de formulario?

Después de considerar todo aquí, tal vez lo que está buscando es una forma de procesar datos en su cadena de consulta para completar un formulario. Puede hacerlo sin usar request.GET como su form.data .

Desde mi punto de vista, aprovecho una función de utilidad que creé para agregar datos iniciales al formulario de request.GET , pero no voy a compartir esa función aquí. Aquí está la firma, sin embargo. initial_dict es típicamente request.GET . model_forms es un ModelForm único o una lista de ModelForm .

def process_initial_data(model_forms, initial_dict):

Sin embargo, puedo procesar el formulario a través de la práctica estándar de usar request.POST cuando el formulario está PUBLICADO. Y no tengo que pasar todo tipo de información en la cadena de consulta URL o modificarla con JavaScript a medida que el usuario ingresa información.


Si su carga de página limpia no tiene ningún parámetro GET que no forma, puede diferenciar entre una carga de página limpia y un envío de formulario en su vista. En lugar de lo usual

form = YourForm() if request.POST:

tu puedes hacer

if request.GET.items(): form = YourForm(request.GET) if form.is_valid(): ... else: form = YourForm()

Si su carga de página limpia puede tener otros parámetros (por ejemplo, parámetros de seguimiento de enlace de correo electrónico) necesitará usar los métodos QueryDict para probar si alguno de los parámetros de su formulario está en la solicitud.


request.GET es un diccionario vacío cuando carga por primera vez un formulario limpio. Una vez que haya enviado el formulario, request.GET se completará con los datos de su campo, incluso si los campos contienen solo datos vacíos.