2012-02-13 30 views
0

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

我正在显示模型表单集合。我正在使用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'} 

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

回答

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。它不会伤害任何东西,但它只是无关的代码。

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

+0

感谢您的支持。我会试一试。我会在你的笔记1-3中做出你所建议的改变。我会研究注4。 – trubliphone 2012-02-13 21:07:01

+0

+1,所有优点(尽管在视图中的打印语句对我来说是有罪的)。编号5:返回json数据而不是初始字典的字符串表示。这将使JavaScript更容易。 – Alasdair 2012-02-13 21:21:14

+0

@Alasdair:关于响应的一些事情扰乱了我,但我完全忽略了这个事实,即这应该是一个AJAX响应。哈哈,很好。 – 2012-02-13 21:24:49

相关问题