【问题标题】:add initial data to a Django ModelForm using JavaScript (JQuery)使用 JavaScript (JQuery) 将初始数据添加到 Django ModelForm
【发布时间】:2012-02-13 18:35:29
【问题描述】:

全部,

我正在视图中显示模型表单集。我正在使用 JQuery 动态表单集插件 [http://code.google.com/p/django-dynamic-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'}

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

【问题讨论】:

    标签: javascript jquery django django-forms


    【解决方案1】:

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

    $('#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,则无需将其传递给查询。它不会伤害任何东西,但它只是无关代码。

    4. 如果您正在处理这样的通用内容类型,您应该使用contenttypes 框架中提供的工具,而不是自行开发。

    【讨论】:

    • 谢谢。我会试一试。我会做出你在笔记 1-3 中建议的更改。我会研究注释 4。
    • +1,所有优点(尽管视图中的打印语句对我来说是一种内疚的乐趣)。数字 5:返回 json 数据而不是初始字典的字符串表示形式。这将使 javascript 更容易。
    • @Alasdair:关于响应的某些事情困扰着我,但我完全不知道这应该是 AJAX 响应这一事实。哈哈,好收获。
    • @Chris:我还没有完成这项工作,但这只是因为您的其他建议促使我重写了大量代码。现在效率更高了。谢谢。
    猜你喜欢
    • 2012-06-05
    • 2019-08-11
    • 2016-06-12
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多