python - relaciones - submit django form
¿Cómo puedo crear múltiples formularios de envío django? (5)
Ahora es una vieja pregunta, sin embargo, tuve el mismo problema y encontré una solución que funciona para mí: escribí MultiRedirectMixin.
from django.http import HttpResponseRedirect
class MultiRedirectMixin(object):
"""
A mixin that supports submit-specific success redirection.
Either specify one success_url, or provide dict with names of
submit actions given in template as keys
Example:
In template:
<input type="submit" name="create_new" value="Create"/>
<input type="submit" name="delete" value="Delete"/>
View:
MyMultiSubmitView(MultiRedirectMixin, forms.FormView):
success_urls = {"create_new": reverse_lazy(''create''),
"delete": reverse_lazy(''delete'')}
"""
success_urls = {}
def form_valid(self, form):
""" Form is valid: Pick the url and redirect.
"""
for name in self.success_urls:
if name in form.data:
self.success_url = self.success_urls[name]
break
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
"""
Returns the supplied success URL.
"""
if self.success_url:
# Forcing possible reverse_lazy evaluation
url = force_text(self.success_url)
else:
raise ImproperlyConfigured(
_("No URL to redirect to. Provide a success_url."))
return url
Tengo un formulario con una entrada para el correo electrónico y dos botones de envío para suscribirse y cancelar la suscripción al boletín informativo:
<form action="" method="post">
{{ form_newsletter }}
<input type="submit" name="newsletter_sub" value="Subscribe" />
<input type="submit" name="newsletter_unsub" value="Unsubscribe" />
</form>
También tengo forma de clase:
class NewsletterForm(forms.ModelForm):
class Meta:
model = Newsletter
fields = (''email'',)
Debo escribir mi propio método clean_email y necesito saber por qué botón se envió el formulario. Pero el valor de los botones de enviar no está en el diccionario self.cleaned_data
. ¿Podría obtener valores de botones de lo contrario?
P.ej:
if ''newsletter_sub'' in request.POST:
# do subscribe
elif ''newsletter_unsub'' in request.POST:
# do unsubscribe
Puede usar self.data
en el método clean_email
para acceder a los datos POST antes de la validación. Debe contener una clave llamada newsletter_sub
o newsletter_unsub
dependiendo de qué botón se haya pulsado.
# in the context of a django.forms form
def clean(self):
if ''newsletter_sub'' in self.data:
# do subscribe
elif ''newsletter_unsub'' in self.data:
# do unsubscribe
También puedes hacer esto,
<form method=''POST''>
{{form1.as_p}}
<button type="submit" name="btnform1">Save Changes</button>
</form>
<form method=''POST''>
{{form2.as_p}}
<button type="submit" name="btnform2">Save Changes</button>
</form>
CÓDIGO
if request.method==''POST'' and ''btnform1'' in request.POST:
do something...
if request.method==''POST'' and ''btnform2'' in request.POST:
do something...
una url a la misma vista! ¡al igual que!
###urls.py###
url(r''^$'', views.landing.as_view(), name = ''landing''),
####views.py####
class landing(View):
template_name = ''/home.html''
form_class1 = forms.pynamehere1
form_class2 = forms.pynamehere2
def get(self, request):
form1 = self.form_class1(None)
form2 = self.form_class2(None)
return render(request, self.template_name, { ''register'':form1, ''login'':form2,})
def post(self, request):
if request.method==''POST'' and ''htmlsubmitbutton1'' in request.POST:
## do what ever you want to do for first function ####
if request.method==''POST'' and ''htmlsubmitbutton2'' in request.POST:
## do what ever you want to do for second function ####
## return def post###
return render(request, self.template_name, {''form'':form,})
####/home.html####
#### form 1 ####
<form action="" method="POST" >
{% csrf_token %}
{{ register.as_p }}
<button type="submit" name="htmlsubmitbutton1">Login</button>
</form>
#### form 2 ####
<form action="" method="POST" >
{% csrf_token %}
{{ login.as_p }}
<button type="submit" name="htmlsubmitbutton2">Login</button>
</form>