2013-06-19 2 views
0

모두,ajax를 통해 장고 formset 유효성을 검사

인라인 형식 세트가있는 장고보기가 있습니다. 보기에 정상적으로 액세스하고 제출하면 모든 것이 올바르게 작동합니다.

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

내 코드의 단순화 된 버전입니다 : 내가 AJAX를 통해 액세스 할 때,하지만, 내가 유효성 검사 오류 수 (이것은 다른 페이지 내에서 JQuery와 통화에서 액세스됩니다

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

을하는

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

업데이트 :

inline_formsets와 "my_form.html")와 유사한 구조를 가지고

아직 해결하지 못했지만 문제를 조금 좁혔습니다. "edit_model"함수를 트리거하는 버튼은 버튼이 만드는 대화 상자에서 렌더링되는 것과 동일한 유형의 자체 양식 및 형식 세트가있는 다른 페이지에 있습니다. 제출이 대화 상자의 양식에 푸시되면 대화 상자의 페이지와 함께이 상위 페이지의 POST가 트리거 된 것으로 보입니다. 물론 두 페이지의 관리 데이터가 일치하지 않습니다.

그래서 부모 페이지로 전달되는 대화 상자에서 제출되지 않도록하는 방법을 알아 내려고하고 있습니다.

+0

'{{form.management_form}}'이 (가) 포함되어 있습니까? – karthikr

+0

@karthikr - 예, 있습니다. – trubliphone

답변

1

대화 상자의 양식의 기본 "제출"동작에 의존하지 않고 적절한 값으로 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'); 
    } 
    })      
관련 문제