2011-03-29 14 views
26

Esto es lo que tengo:django - ¿Qué entra en el parámetro de acción de formulario cuando la vista requiere un parámetro?

myview.py con una vista que toma un parámetro user:

def myview(request, user): 
    form = MyForm(request.POST) 
    .... 
    return render_to_response('template.html',locals(), context_instance=RequestContext(request)) 

El user se transfieren a través de una URL.

urls.py:

... 

urlpatterns += patterns('myview.views', 
    (r'^(?P<user>\w+)/', 'myview'), 
) 

... 

que también tienen un template.html con una forma:

<form name="form" method="post" action="."> 
... 
</form> 

Lo que pasa en el parámetro de acción del formulario si myview función requiere un parámetro?

Ahora tengo action=".". La razón por la que estoy preguntando es porque cuando llene el formulario En (templates.html) y haga clic en el botón Enviar, no veo absolutamente ningún valor de campo pasado de ese formulario. Es casi como si estuviera pasando un formulario vacío cuando hago clic en el botón Enviar. ¿Algunas ideas? ¡Gracias!

Respuesta

16

está publicando a la misma vista que también sirve el formulario. Entonces, al principio, la vista se llama y sirve la forma. Cuando publica el formulario, se llama a la misma vista pero esta vez procesa el formulario. Es por eso que la acción está vacía.

+0

Echaré un vistazo a esto. Tiene sentido. Gracias por la respuesta. – avatar

+0

Si ese es el caso, ¿qué debería hacer exactamente para evitarlo? – avatar

+3

deshacerse del punto en acción = ".". Luego, el formulario se publicará en la misma vista y se procesará. ¿Qué estás tratando de evitar? Si desea publicar en una vista diferente, puede poner la ruta en acción en lugar de dejarla vacía –

5

No debería requerir nada. Suponiendo que está en la siguiente dirección:

www.yoursite.com/users/johnsmith/ 

Su forma debe ser:

<form name="form" method="post" action=""> 

En este punto, usted ya está en myview con el usuario johnsmith. Su punto de vista debe ser similar a la siguiente:

if request.method == 'POST': 
    form = MyForm(request.POST) 
    if form.is_valid(): 
     # you should be able to extract inputs from the form here 
else: 
    form = MyForm() 
+2

Algunos navegadores (por ejemplo, versiones recientes de Chrome) no se publicarán si el atributo de acción está vacío. – shacker

+0

@shacker tal vez 'action =". "' Es suficiente para resolver el problema con Chrome? – Paolo

21

Si desea establecer explícitamente la acción, suponiendo que tiene una variable nombre de usuario en su plantilla,

<form name="form" method="post" action="{% url myview.views username %}"> 

o se puede asignar un nombre para la url en su urls.py por lo que podría hacer referencia a ella como esto:

# urls.py 
urlpatterns += patterns('myview.views', 
    url(r'^(?P<user>\w+)/', 'myview', name='myurl'), # I can't think of a better name 
) 

# template.html 
<form name="form" method="post" action="{% url myurl username %}"> 
2

Puede usar request.path y eso funcionará en la mayoría de los casos.

Cuestiones relacionadas