django - mapa - dinamica poblacional y sus caracteristicas
Formas dinámicas de Django: ¿población de campo sobre la marcha? (2)
Aquí hay un enfoque: ¿ Django / jQuery Cascading Select Boxes?
Puede crear una nueva vista que simplemente represente json a una cadena, y luego desencadenar un evento cuando haya terminado de seleccionar de la primera lista que carga los datos dinámicamente desde ese json.
He estado escaneando la documentación de Django y los resultados de búsqueda de Google toda la tarde y todavía estoy un poco atascado en mi intento de crear un formulario dinámico. Espero que solo necesite que alguien me empuje en la dirección correcta :-) Estoy empezando a aprender Django, así que todavía soy un principiante. Sin embargo, ya soy un usuario intermedio de Python.
Lo que estoy tratando de hacer es crear un formulario dinámico, donde el usuario realiza una selección de un menú desplegable y, en función de esa selección, otra parte del formulario se actualizará automáticamente para mostrar los resultados relevantes para el elemento seleccionado actualmente, pero de otra tabla de base de datos.
Intentaré usar una versión simplificada de los modelos del tutorial de Django para ilustrar mejor lo que estoy tratando de hacer:
# models.py
from django.db import models
class Poll(models.Model):
question = models.CharField(max_length=200)
class Choice(models.Model):
poll = models.ForeignKey(Poll)
choice = models.CharField(max_length=200)
Digamos que quiero tener algo así como un campo de selección desplegable, rellenado con la pregunta de cada encuesta en la base de datos. También quiero tener un campo de texto, que muestra las opciones correspondientes para la encuesta seleccionada actualmente, que se actualizará sobre la marcha cada vez que el usuario seleccione un grupo diferente. He podido resolver esto colocando un botón y publicando información en el formulario; Sin embargo, estoy tratando de hacer esto automáticamente cuando el usuario hace una selección. Mi punto de vista se ve algo como esto en este momento:
#view.py
from django import forms
from django.shortcuts import render_to_response
from myapp.models import Poll,Choice
class MyModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "%s" % obj.question
class PollSelectionForm(forms.Form):
polls = MyModelChoiceField( queryset=Poll.objects.all() )
class ChoiceResults(forms.Form):
def __init__(self, newid, *args, **kwargs):
super(ChoiceResults, self).__init__(*args, **kwargs)
self.fields[''choice''] = forms.TextField( initial="" )
def main(request):
return render_to_response("myapp/index.html", {
"object": PollSelectionForm(),
"object2": ChoiceResults(),
})
Mi plantilla es muy simple, solo algo como
{{ object }}
{{ object2 }}
Estoy seguro de que la forma en que voy a crear los formularios probablemente tampoco sea la mejor, así que siéntase libre de criticar eso también :-) Como mencioné, he leído soluciones que implican volver a publicar el formulario, pero quiero esto. suceder sobre la marcha ... si puedo volver a publicar de forma transparente, entonces estaría bien, supongo. También he visto bibliotecas que te permitirán crear formularios dinámicamente, pero eso parece una exageración.
Hago algo similar aquí, rellenando un formulario basado en una selección en un menú desplegable. Tal vez esto te ayude.
Aquí está el modelo de los valores utilizados para rellenar previamente el formulario:
class OpmerkingenGebrek(models.Model):
opmerking = models.CharField(max_length=255)
advies = models.CharField(max_length=255)
urgentiecodering = models.CharField(max_length=2, choices=URGENTIE_CHOICES_2011)
bepaling = models.CharField(max_length=155,blank=True,null=True)
aard = models.CharField(max_length=3, choices=AARD_CHOICES)
La vista que gestiona el formulario:
def manage_component(request,project_id,.....):
# get values for pre-populate
og = OpmerkingenGebrek.objects.all()
.........
formset = ComponentForm(request.POST,request.FILES)
.........
)))
return render_to_response(template, {
''formset'':formset,
........
''og'':og,
},context_instance=RequestContext(request))
El html hace la forma
{% extends "base.html" %}
{% block extra_js %}
<script type="text/javascript" src="/media/js/limitText.js"></script>
<script type="text/javascript" src="/media/js/getValueOpmerking.js"></script>
{% endblock %}
<form enctype="multipart/form-data" method="post" action="">
{{ formset.as_table }}
</form>
<p>Choose default values:</p>
<select id="default" onChange="getValue(this)">
{% for i in og %}
<option value="{{ i.opmerking }} | {{ i.advies }} | {{ i.urgentiecodering }} |
{{ i.aard }} | {{ i.bepaling }}">{{ i.opmerking }}</option>
{% endfor %}
</select>
El javascript que rellena previamente el formulario:
función getValue (sel)
{
//get values
var opm = sel.options[sel.selectedIndex].value;
//split string to parts
var parts = opm.split("|");
// autofill form
var opmerking = document.getElementById("id_opmerking");
opmerking.value = parts[0];
var aanbeveling = document.getElementById("id_aanbeveling");
aanbeveling.value = parts[1];
var opt = document.getElementById("id_urgentie");
var urgentie = opt.selectedIndex;
for(var i=0;i<opt.length;i++){
if(opt.options[i].value == parts[2].split('' '').join('''')){
opt.selectedIndex = i;
}};
var opt = document.getElementById("id_aard");
var aard = opt.selectedIndex;
for(var i=0;i<opt.length;i++){
if(opt.options[i].value == parts[3].split('' '').join('''')){
opt.selectedIndex = i;
}};
var bepaling = document.getElementById("id_bepaling");
bepaling.value = parts[4];
};