0

全部,

我有一个带有内联表单集的 Django 视图。当我正常访问视图并提交它时,一切正常。但是,当我通过 AJAX 访问它时,会出现验证错误:

[u'ManagementForm data is missing or has been tampered with']

这是我的代码的简化版本:

def edit_model(request):
    model_id = request.GET.get('i', None)
    if model_id:
        model = ModelClass.objects.get(pk=model_id)
    else:
        model = ModelClass()

    related_model_formset_class = inlineformset_factory(ModelClass, RelatedModelClass, form=RelatedModelForm,
                                                        prefix="my_related_models")

    if request.method == "GET":
        model_form = ModelFormClass(request.POST, instance=model)
        related_model_formset = related_model_formset_class(request.POST, instance=model)

        if model_form.is_valid() and related_model_formset.is_valid():
            model_form.save()
            related_model_formset.save()

            return HttpResponse("success")
    else:

        model_form = ModelFormClass(instance=model)
        related_model_initial_values = [{"default_value1": 1, "default_value2": 2},
                                        {"default_value1": 1, "default_value2": 2}]
        related_model_formset = related_model_formset_class(instance=model, initial=related_model_intial_values,
                                                            extra=len(related_model_initial_values))

    rendered_form = django.template.loader.render_to_string("my_form.html",
                                                            {"form": model_form, "formset": related_model_formset},
                                                            context_instance=RequestContext(request))
    return HttpResponse(rendered_form, mimetype='text/html')

这可以从另一个页面中的 JQuery 调用访问(具有与“my_form.html”类似的结构,带有 inline_formsets):

function edit_model(model_id) {

  var url = "http://www.mydomain.com/edit_model/?i=" + model_id

  var edit_model_dialog = $("<div></div>");
  $.ajax({
       url        : url,
       type       : "GET",
       cache      : false,
       success    : function(data) {
          var title = "here is a form to edit the model"
          edit_model_dialog(data);
          edit_model_dialog.dialog({
              title : title,
              modal : true,
              dialogClass: "no-close",
              close   : function() {
                  $(this).dialog("destroy");
              }
          }).dialog('open');
       }
   })

更新:

我仍然没有解决这个问题,但我已经缩小了问题的范围。触发“edit_model”功能的按钮位于另一个页面上,该页面具有自己的表单和表单集,其类型与按钮创建的对话框中呈现的表单和表单集相同。当在对话框中的表单上推送提交时,它似乎会触发来自该父页面的 POST 以及对话框中的页面。显然,这两个页面上的管理数据是不匹配的。

所以,我试图弄清楚如何防止对话框上的提交传播到父页面。

4

1 回答 1

1

我最终更改了我的 javascript 以显式发送具有适当值的 POST,而不是依赖对话框中表单的默认“提交”行为。新代码如下所示:

function edit_model(model_id) {

  var url = "http://www.mydomain.com/edit_model/?i=" + model_id

  var edit_model_dialog = $("<div></div>");
  $.ajax({
     url        : url,
     type       : "GET",
     cache      : false,
     success    : function(data) {
       var title = "here is a form to edit the model"
       edit_model_dialog(data);
       edit_model_dialog.dialog({
         title : title,
         modal : true,
         dialogClass: "no-close",
         close   : function() {
           $(this).dialog("destroy");
         },
         // HERE IS THE NEW BIT...
         buttons : {
           ok : function() {
             // GET THE DATA FROM THE FORM IN THE DIALOG...
             var form_data = $(this).find("the_form").serialize();
             $.ajax({
               url   : url
               // EXPLICITLY SEND IT AS A POST...
               type  : "POST",
               data  : form_data,
               cache : false,
               success : function(data) {
                 if (data == "success") {
                   $(edit_model_dialog).dialog("close");
                 }
                 else {
                   $(edit_model_dialog).html(data);
                 }
               }
             });
           },
           cancel : function () {
             $(edit_model_dialog).dialog("close");
           }
         }
       }).dialog('open');
     }
   })                      
于 2013-06-20T16:47:50.950 回答