2011-05-04 19 views
13

¿Cómo voy a llamar a los siguientes múltiples formas Enviar -referencia a múltiples botones de envío en Django

<form action="/" method="post"> 
    {% csrf_token %} 

    <input type="text" name="{{ email.id }}" value=" {{email}}"></td> 
    <td><input type="submit" value="Edit"></td> 
    <td><input type="submit" value="Delete"></td> 
</tr> 
</form> 

que quiero hacer algo como esto -

if value = edit: 
    do this 

if value = delete: 
    do this 

¿Cómo podría codificar esto en el archivo views.py?

Respuesta

29

Proporcione un nombre a los tipos de entrada y búsquelos en su diccionario request.POST.

ej .:

<form action="/" method="post"> 
    {% csrf_token %} 

    <input type="text" name="{{ email.id }}" value=" {{email}}"></td> 
    <td><input type="submit" value="Edit" name="_edit"></td> 
    <td><input type="submit" value="Delete" name="_delete"></td> 
</tr> 

y en algo views.py como

if request.POST: 
    if '_edit' in request.POST: 
     do_edit() 
    elif '_delete' in request.POST: 
     do_delete() 

EDIT: Se cambió d.has_key(k)-k in d por el comentario de Daniel. has_key está en desuso en python 3.0 y se prefiere el estilo en su versión más genérica: específicamente d.has_key(k) falla si d no es un diccionario, pero k in d funciona para cualquier d que sea iterable (por ejemplo, dict, string, tuple, list, set)

+2

'foo.has_key ('bar')' se ha deletreado como ''bar 'en foo' desde Python 2.4. –

+0

@Daniel: Gracias - Editado con una explicación de por qué se prefiere 'k in d' ya que funciona para cualquier d que sea iterable. –

+2

Tenga en cuenta que si hay varios botones de envío en un formulario y el usuario presiona Intro, se hará clic automáticamente en el botón que aparezca primero en el HTML. –

4

Usted tendría que dar a los botones Enviar un atributo de nombre, diga "acción", por ejemplo, entonces se podría hacer referencia a ellos en la colección request.POST:

def my_view(request): 
    action = request.POST.get('action') 
    if action == 'Edit': 
     #do edit 
    else: 
     # do delete 

la esperanza de que le ayuda a cabo.

+0

se romperá después del cambio de título, por ejemplo, internacionalización. Sin embargo, funcionará con '

0
<form action="/" method="post"> 
<tr> 
    <td><input type="text" name="{{ email.id }}" value=" {{email}}"></td> 
    <td><input type="submit" value="Edit" name="submit"> </td> 
    <td><input type="submit" value="Delete" name="submit"> </td> 
</tr> 
</form> 

views.py será -

def our_view(request): 
    if request.POST.get('submit') == 'Edit': 
     make_edit() 
    elif request.POST.get('submit') == 'Delete': 
     make_deletes() 
    else: 
     raise Http404() 
+0

No creo que esto funcione. Mire su diccionario 'request.POST'. Estará compuesto por algo como '{'3': '[email protected]', 'edit': 'Edit'}'. Al igual que no puede hacer referencia a la dirección de correo electrónico al obtener '' text'' de 'request.POST', debe proporcionar el nombre del botón de entrada para obtener sus valores. –

6

Sé que esta pregunta fue hecha hace mucho tiempo, pero que conste que aquí hay una solución con vistas basadas en clases. Utiliza el mismo html que en la respuesta de dr jimbob.

from django.views.generic.edit import FormView 

class MyView(FormView): 
    template_name = 'mytemplate.html' 
    form_class = MyForm 

    def form_valid(self, form): 
     if '_delete' in self.request.POST: 
      # do delete 
     elif '_edit' in self.request.POST: 
      # do edit 

Nota el comportamiento predeterminado de form_valid es:

return HttpResponseRedirect(self.get_success_url()) 
+0

Utilicé la tecla '' if "en form.data: form.instance.field = special_value'' –

Cuestiones relacionadas