JQuery UI ダイアログ (モーダル モード) を使用して、Django を使用して動的に生成されたフォームを表示する Web ページに取り組んでいます。基本的な流れは次のとおりです。
- ユーザーがボタンをクリックする
- jquery (AJAX を使用) は、フォームの html を返す get リクエストを発行し、それを使用してダイアログに入力します。
- html には、正常にロードされ、期待どおりに動作するフォーム上の UI を処理するスクリプト タグが含まれています。
- ユーザーがフォームに入力して [完了] をクリックすると、フォームが送信されます。
この問題は、ユーザーがフォームでエラーを起こしたときに発生します。サーバーは、エラーを表示するように変更された元のフォーム (スクリプトを含む) を使用して、投稿要求 (フォームを送信する) に応答します。スクリプトが 2 回目に読み込まれると、「Uncaught ReferenceError: $ is not defined (anonymous function)」が返されます。スクリプトは、正常に動作したときとまったく同じです。このプロセス全体を通して明確にするために、ページは決して更新されません。
モーダルを処理する JavaScript の要点は次のとおりです。
var add_container = $("#add_container");
add_container.dialog({...})
function show_form(form,response_func) {
add_container.html(form);
add_container.dialog("open");
$("#add_form").submit(function (event) {
return submit_form($(this),response_func);
});
}
function submit_form(form,response_func) {
add_container.append('<p>Adding...</p>');
//this is a trick to upload a file without reloading the page
form.attr('target','upload_target');
$('#upload_target').load(function() {
var response = $('#upload_target').contents().find('body').html();
add_container.dialog("close");
resp_obj = $(response)
if (resp_obj.is('form')) {
//***this is what reloads the form when there is an error
show_form(response,response_func);
} else {
response_func(resp_obj);
}
});
}
$('#add_link').click(add_link);
function add_link() {
$.get('/add_link', function(data) {
function add_response(response) {
//handle successful submission
}
show_form(data,add_response);
});
}
//...more stuff that is not important
これは、/add_link から返される html の要点です。
<script type="text/javascript" src="/scripts/add_form.js" ></script>
<form id="add_form" enctype="multipart/form-data" action="/add_link/" method="post">
<!-- Dynamically generated form here !-->
</form>
add_form.js は、jQuery を使用する非常に標準的な JavaScript ファイルです。$(document).ready(function () {...} ) で始まり、最初の $ は ReferenceError が発生する場所です
クリックされたものに基づいてフォームを動的に生成する必要があるため、すべてを静的にページに配置することはできません。スクリプトは動的に生成されないため、必ずしも動的にロードする必要はありませんが、独自のファイルに保持する方法がわかりませんでした。また、フォームがロードされたときにのみ実行します。同じ効果を達成するための別の方法の提案を歓迎します。