在Django中,如何将表单返回到Javascript函数?

时间:2013-08-23 16:46:13

标签: django django-forms django-templates django-views

在我的模板中,我有javascript向Django方法发送GET调用。在这个方法中,我想将一个空白表单返回给模板。这是我的javascript:

require(["dojo/request/xhr", "dojo/domReady!"],
    function(xhr, ready){
        var url = window.location.pathname + "dev/" + report_id + "/" + report_url + "/";
        xhr(url, {
            method: "get"
        }).then(
            function(response){
                var json_response = JSON.parse(response);
                //do stuff
            }
        );
    });

以下是我的Django视图中发生的事情:

def my_view(request):
    if request.method == "GET":
        form = MyForm()
        data = json.dumps({
            'form': form,
        })

        return HttpResponse(data, mimetype="application/json")
    else:
        #do other stuff

这是我现在得到的错误:

raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <development.dev_forms.MyForm object at 0x7f3a8dd07e50> is not JSON serializable

所以我似乎无法序列化Django表单。所以,我想以某种方式将此表单的字段返回给模板。我还有什么方法可以做到这一点?有没有办法获得所有字段的HTML?然后我可以自己建一本字典。还有其他建议吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我认为你需要的是返回一个html表单。如果要显示带有ajax的表单,则应该这样做。例如,您可以将render_to_response与模板一起使用,以呈现所需的表单,并在模板的上下文中传递表单.....

我不知道您想对表单做什么,但我认为这样的事情可以帮助您:

查看文件

from django.shortcuts import render_to_response

def my_view(request):
    if request.method == "GET":
        form = MyForm()
        return render_to_response('app/template.html', {"form": form})
    else:
        #do other stuff

应用/ template.html

<form action='some_url' method='get'>
    {{form}}
    <input type='submit' value'Save' />
</form>

答案 1 :(得分:1)

首先需要渲染表单,然后将其传递回ajax调用:

ctx = {'form': MyForm()}

data = {
    "form": render_to_string("app/form_template.html", ctx, context_instance=RequestContext(request))
        }
return HttpResponse(json.dumps(data), mimetype="application/json")

然后在您的ajax调用的json_response.form函数中使用success获取表单。