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')

これは、別のページ (「my_form.html」と同様の構造を持ち、inline_formsets を含む) 内の JQuery 呼び出しからアクセスされます。

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 がトリガーされているようです。明らかに、これら 2 つのページの管理データは一致しません。

そのため、ダイアログでの送信が親ページに伝播しないようにする方法を見つけようとしています。

4

1 に答える 1

1

ダイアログのフォームのデフォルトの「送信」動作に依存するのではなく、適切な値で POST を明示的に送信するように JavaScript を変更することになりました。新しいコードは次のようになります。

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 に答える