2011-06-29 14 views
7

He estado usando this site como un ejemplo de cómo hacer una forma dinámica en Django. En su opinión se utilizaAccediendo a datos POST en forma de Django

if request.method == 'POST': 
    form = UserCreationForm(request.POST) 

para pasar los datos en la forma y en la forma que utiliza el constructor

extra = kwargs.pop('extra') 

acceder a los datos POST. Traté de hacer algo similar con mi punto de vista:

def custom_report(request): 
    if request.method=='POST': 
     form=CustomQueryConstraintForm(request.POST) 
    else: 
     form=CustomQueryConstraintForm() 
    return render(request, 'frontend/custom_report.html', {'form':form}) 

En mi forma constructor Imprimí args y kwargs y encontró que kwargs está vacío y args es una tupla que contiene el QueryDict que a su vez contiene los datos POST. Si, en cambio, trato de usar form=CustomQueryConstraintForm(**request.POST), cada elemento en kwargs es una lista que contiene el valor del campo como su único elemento. ¿Estoy haciendo algo mal aquí? De lo contrario, ¿hay una manera más elegante de acceder a los datos que args[0][element_name][0]?

Respuesta

6

Ese es el comportamiento esperado de los formularios: los datos POST que pasa al formulario es el primer argumento, args [0] y no un argumento de palabra clave. ¿Qué estás buscando?

data = args[0] 
print data['my_field'] 

y en la forma que utiliza el constructor adicional kwargs.pop = ('extra') para acceder a los datos POST.

kwargs.pop('extra') no obtiene los datos POST. Es una lista de preguntas asociadas con ese usuario dado, un escenario dado por el autor que el "departamento de marketing" le entregó.

En cualquier caso, si necesita acceder a los datos de la publicación en cualquier punto de un formulario, me parece self.data el más limpio que se establece en forms.__init__.

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.data['my_field'] 
+0

Gracias, eso funcionó para mí. Todavía estoy confundido acerca de por qué los datos POST aparecieron en 'kwargs' en el ejemplo, pero no en mi código. – murgatroid99

+0

¿De qué ejemplo estás hablando? El ejemplo en la publicación a la que vinculó dice extra es una lista de cadenas, no datos POST. Si desea publicar datos como kwarg, simplemente pase ''mykwarg = request.POST' y luego' kwargs.pop (' mykwarg ') 'en su función' __init__'. –

+0

Estás en lo correcto. Leí mal el código en esa página. – murgatroid99

0

Si entiendo correctltly, después de una petición POST está tratando de volver a mostrar la misma página de formulario en el que se llenan los campos del formulario, ¿verdad? Si es así, esto es lo que necesita:

form = CustomQueryConstraintForm(initial=request.POST) 
0

También puede acceder a los datos del formulario a través del diccionario cleaned_data después de usar el método is_valid(). De esta manera:

jobForm = JobForm(request.POST) 
jobForm.is_valid() 
jobForm.cleaned_data 

es un diccionario de los valores que se han ingresado en el formulario.

Cuestiones relacionadas