ユーザーがフォームを動的に追加および削除できるWebページをdjangoフォームセットに持っています。
Ajax を使用してフォームを Django フォームセットに動的に追加するを読みました。これに基づいて、フォームをフォームセットに動的に追加できます。ここで、フォームセットを動的に削除したいと思います。私はDjangoでインラインフォームセットを動的に削除するを見てきました
私がやりたいのは、ユーザーが削除をクリックしたときです。データベースからフォームインスタンスレコードを削除する ajax 関数があります。私のajax関数が戻ってきたら、同じtotal_form_countとinitial_form_countを保持し、フォームhtmlを非表示にして、削除されたレコードもPOSTで送信されるようにします。
最初に、フォームセットはフォーム要素を次のようにレンダリングします。
#form0
<input id="id_formprefix-0-id" type ="hidden "value="something" name="formprefix-0-id">
<input id="id_formprefix-0-field" value="something" type="text" name="formprefix-0-field">
#form1
<input id="id_formprefix-1-id" type ="hidden "value="something" name="formprefix-1-id">
<input id="id_formprefix-1-field" value="something" type="text" name="formprefix-1-field">
#form2
<input id="id_formprefix-2-id" type ="hidden "value="something" name="formprefix-2-id">
<input id="id_formprefix-2-field" value="something" type="text" name="formprefix-2-field">
ここで、ajax を使用してフォーム 0 を動的に削除するとします。レコードが削除された後、フォーム カウントは変更しないため、total_form_count と initial_form_count は 3 です。
(この場合、total_form_count と initial_form_count を 2 に減らすと、POST データを使用してビューにフォームセットを入力すると、form0 と form1 として順序付けられることが期待されます。しかし、私の場合、有効なフォームは form1 と form2 です)
私の見解では、フォームを保存するために次のようなことをしています。
myformset = modelformset_factory(ObjectElement,form=Object_Form, extra=0, can_delete=True)
for form in myformset.forms:
print(form.instance.id) #this does not print id of deleted record, but of the first existing record in the database.
print(form.instance.attribute)# this prints the correct element, which was submitted by POST even for a deleted record.
try:
objectInstance = ObjectElement.objects.get(id = form.instance.id)
objectInstance.save()
except ObjectElement.DoesNotExist:
print("Do not save as the record has already been deleted")
レコードを削除せずにフォームセットを保存すると、保存は正常に機能し、正しいものform.instance.id
が印刷されます。ただし、ajax を使用してフォーム インスタンスを削除し、フォームセットを保存しようとすると
print(form.instance.id)
、削除されたレコードはデータベースで最初に使用可能な ID を出力するように見えますが、投稿された ID は出力されません。(レコードが削除されるため、ID はデータベースに存在しませんが、POST を介して送信されたものを印刷する必要がありますか?)
try/catch ループなしで実行すると、form.errors によって次のエラーが発生します。
<ul class="errorlist"><li>id<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul>
これは、削除されたレコードに対して送信された投稿から正しいフォーム ID を受け入れていないことを示しているようです。
私がここで見逃しているものについて何か考えがある人はいますか? または、これを行うより良い方法。
フォームの順序は連続しているように見えるため、フォームセットからフォームを動的に削除する方法..
前もって感謝します!!どんな助けでも大歓迎です。