I want to update a form on the change event of my drop down list.
Here is my view:
from django.utils import simplejson
response_dic={}
#drop down list
actToValidateId=add_form.cleaned_data['actsToValidate'].pk
act=ActsIdsModel.objects.get(id=actToValidateId)
ids_form = ActsIdsForm(instance=act)
ids_form_dic={}
for field in ids_form.fields:
ids_form_dic[field]=getattr(act, field)
response_dic['ids_form']=ids_form_dic
response_dic['act']=dict([(attr, getattr(act, attr)) for attr in [f.name for f in act._meta.fields]])
return HttpResponse(simplejson.dumps(response_dic), mimetype="application/json")
Here is the javascript code:
function display_act_ids(choice)
{
$form=$('#act_ids_form');
var form_data = $form.serialize();
$.ajax
({
url: $form.attr('action'),
type: 'POST',
dataType: 'json',
data: form_data,
success: function(result)
{
alert(result.ids_form.fileNoCelex);
}
});
//don't submit the form
return false;
}
Now, two problems:
1/ If i want to assign the corresponding values to my form controls, I can update the success function as below:
$("#myfield").val(result.ids_form.myfield);
But what if I have many fields to fill? Is there a function to do that automatically? Maybe a loop would do...
2/My main problem: I use my act instance (and other variables) in lots of places in my template (not in my form). For example:
{% if act.councilPath %}
<div class="row-fluid">{{ act.councilPath }}</div>
{% endif %}
In such a way, it is impossible to use ajax. Which means I have to rewrite my template to have it work. For example:
<div id="council_path" class="row-fluid"></div>
And in my success function:
$("#council_path").html(result.act.councilPath);
This would be very long to update. Is there a better way to do, such as an ajax "post and load"?
Please tell me if I am not clear.
To update a django form with jquery/ajax, here is my method... Three key points: put your form template in a separate html page, use render_to_string in your view and send an html response to ajax.
index.html page:
forms.py:
form.html:
urls.py:
views.py:
Ajax call:
Voila !