用jquery/ajax更新django表单

rom*_*rom 3 forms django ajax jquery

我想在下拉列表的更改事件中更新表单.

这是我的观点:

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")
Run Code Online (Sandbox Code Playgroud)

这是javascript代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

现在,有两个问题:

1 /如果我想将相应的值分配给我的表单控件,我可以更新成功函数,如下所示:

$("#myfield").val(result.ids_form.myfield);
Run Code Online (Sandbox Code Playgroud)

但是,如果我有很多字段要填写怎么办?有自动执行此功能的功能吗?也许循环会做......

2 /我的主要问题:我在模板中的很多地方使用了我的act实例(以及其他变量)(而不是我的形式).例如:

{% if act.councilPath %}
    <div class="row-fluid">{{ act.councilPath }}</div>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

以这种方式,不可能使用ajax.这意味着我必须重写我的模板以使其工作.例如:

<div id="council_path" class="row-fluid"></div>
Run Code Online (Sandbox Code Playgroud)

在我的成功功能:

 $("#council_path").html(result.act.councilPath);
Run Code Online (Sandbox Code Playgroud)

这将是非常长的更新.有没有更好的方法,比如ajax"post and load"?

如果我不清楚,请告诉我.

rom*_*rom 6

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:

{% extends "base.html" %}

{% block content %}
    <!-- you can put here everything that doesn't need to be updated (text, css inclusion, etc.) -->
    <!-- act validation form -->
    <form id="act_ids_form"  class="form-inline" action="{% url act_ids %}" method="post">{% csrf_token %}
            <!-- drop down list -->
            <div id="actsToValidateChoice" class="fieldWrapper">
                  {{ add_form.actsToValidate.errors }}
                  {{ add_form.actsToValidate }}
            </div>
            <!-- div to update the part of the form that must be updated -->
            <div id="act_ids_form_div">{% include form_template %}</div>
    </form>

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

forms.py:

class ActsAddForm(forms.Form):
        #drop down list      
        actsToValidate=forms.ModelChoiceField(queryset=ActsIdsModel.objects.filter(validated=0), empty_label="Select an act to validate", widget=forms.Select(attrs={'onchange': 'display_act_ids()'}))
Run Code Online (Sandbox Code Playgroud)

form.html:

<!-- act ids form -->
<!-- put here everything that must be updated on the change of your drop down list -->
<div class="row-fluid">{{ ids_form.non_field_errors }}</div>

{% if act.councilPath %}
        <div class="row-fluid"><a class="info_msg" href="{{act.councilPath}}" target="_blank">{{ displayName.councilPath }}</a></div>
{% endif %}

<table class="table table-bordered table-hover table-condensed span12">
        <tr>
            {% for field in ids_form %}
                <td>
                    <div class="fieldWrapper">
                        {{ field.errors }}
                        {{ field }}
                    </div>
                </td>
            {% endfor %}
        </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

urls.py:

from django.conf.urls import patterns, url

urlpatterns = patterns('actsIdsValidation.views',
    url(r'^/?$', 'act_ids', name='act_ids'),
    url(r'^form.html$', 'act_ids', name='act_ids'),
)
Run Code Online (Sandbox Code Playgroud)

views.py:

def act_ids(request):
    response_dic={}
    #html page of the form
    form_template='actsIdsValidation/form.html'

    if request.method == 'POST':
        #if drop down list not empty
        if request.POST["actsToValidate"]!="":
            #add form: contains the drop down list only
            add_form = ActsAddForm(request.POST);
            actToValidateId=request.POST["actsToValidate"].pk
            act=ActsIdsModel.objects.get(id=actToValidateId)
            ids_form = ActsIdsForm(instance=act)
            response_dic['ids_form']=ids_form
            response_dic['act']=act

            return HttpResponse(render_to_string(form_template, response_dic, RequestContext(request)))

    #GET
    #unbound ids_form
    response_dic['ids_form'] = ActsIdsForm()
    response_dic['add_form'] = ActsAddForm()
    response_dic['form_template'] = form_template
    return render_to_response('actsIdsValidation/index.html', response_dic, context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

Ajax call:

function display_act_ids()
{
    $form=$('#act_ids_form');
    var datastring = $form.serialize();
    $.ajax({
        type: "POST",
        url: $form.attr('action'),
        dataType: 'html',
        data: datastring,
        success: function(result)
        {
            /* The div contains now the updated form */
            $('#act_ids_form_div').html(result);
        }
    });

    //don't submit the form
    return false;
}
Run Code Online (Sandbox Code Playgroud)

瞧!