使用JavaScript(JQuery)将初始数据添加到Django ModelForm

时间:2012-02-13 18:35:29

标签: javascript jquery django django-forms

所有

我在视图中显示了modelformsets。我正在使用JQuery dynamic-formset插件[http://code.google.com/p/django-dynamic-formset/]来处理在该formset中添加/删除单个表单。

当我添加新表单时,我想让用户选择从数据库中选择一个模型来填充该表单。我使用AJAX调用Django视图获取可用的模型。另一个AJAX调用获取与所选模型对应的表单的form.initial数据。我的问题是如何获取初始数据并在模板上填充新添加的表单(在客户端 - 在JavaScript中)。以下是一些相关代码:

查看获取初始数据:

def get_content(request):
    app_to_get = request.GET.get('a', None)
    model_to_get = request.GET.get('m', None)
    id_to_get = request.GET.get('i',"")
    if not app_to_get and not model_to_get and not id_to_get:
        print "invalid or incomplete app/model/id combination"
        raise Http404()

    id_to_get = int(id_to_get)    

    # these two fns get me the appropriate classes for the model_to_get
    # they work and are irrelevant for my current question    
    model_class = get_model_from_name(model_to_get,app_to_get)
    form_class = get_form_from_model(model_class)

    model = model_class.objects.get(pk=id_to_get)
    form = form_class(instance=model)    

    formTemplate = Template("{{ form.initial }}")
    formContext  = Context({"form" : form})

    return HttpResponse(formTemplate.render(formContext));

这是一些JavaScript:

function add_model() {
        var url = window.document.location.protocol + "//" + window.document.location.host + "/get_content/";
        url += "?a=" + app_to_add_to + "&m=" + model_to_add + "&i=" + id_to_add;

        $.ajax({
            url : url,
            type : 'get',
            success : function(data) {
                alert(data);
                /* I AM HERE I AM HERE I AM HERE */
            }
        });
        return true;
    };

此时,data看起来像这样:

{'url': u'http://www.foo.com/', 'id': 2, 'title': u'foo'}

但我不知道如何将这些数据映射到我新添加的表单。

1 个答案:

答案 0 :(得分:2)

您只需使用相关数据设置相关字段的值:

$('#some_field').val(data.some_value);

您必须弄清楚您的字段的ID是什么,因为它很可能是某种形式的#field_id_[N],其中N是添加的表单的迭代。只需在Firebug之类的内容中反省文档源,就可以看到生成的表单的HTML样式。

一般说明

  1. 请勿在视图代码中使用print。在开发中print将输出到控制台,因为Django开发服务器以交互方式运行,但在生产中将最终存在于某个日志文件中或根本不存在。如果某些内容不正确并且您希望收到通知或故意使用实际的Django日志记录实用程序进行日志记录,请始终引发异常。

  2. 在没有提供数据的情况下提升Http404并不是处理这种情况的最佳方式,尤其是在处理AJAX时。返回HttpResponseBadRequest()可能更合适,在提供的数据与数据库中的任何内容不匹配时保留Http404异常。

  3. 如果您只是将id_to_get传递给查询,则无需将int转换为contenttypes。它不会伤害任何东西,但它只是无关的代码。

  4. 如果你正在处理这样的通用内容类型,你应该使用{{1}}框架中的设施,而不是自己动手。