全て、
インラインフォームセットを備えた 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 つのページの管理データは一致しません。
そのため、ダイアログでの送信が親ページに伝播しないようにする方法を見つけようとしています。