0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

htmxを使ってみた-(10)データの変更-

Last updated at Posted at 2024-10-22

データを変更するためのダイアローグ

編集欄にある * をクリックすると、
07.png
編集ダイアローグ
08.png
を出すようにします。
練習プログラムでは、

<td class="pseude_link" hx-get="/edit_institution/26" hx-target="#detail" hx-on::after-request="show_dialog()">*</td>

として、 編集欄のアスタリスクに、hx-get属性 、 hx-target属性 、 hx-on 属性を付けます。
class="pseude_link"は、アスタリスクに下線を付け、マウスを持って行くとカーソルを変えるようにするクラスの指定で、プログラム的な意味はありません。
hxmxのホームページには、クリックしたら編集できるようにするデモインライン編集のデモがあります。
練習プログラムの動作は

  1. アスタリスク(<td>タグ)をクリックすると、
  2. hx-get属性により、HTTPのGETメソッドで、サーバーの/edit_institution/26にアクセスし、
  3. hx-target属性により、サーバーからの応答で、idに"detailを持つ要素"を持つタグの中身を書き換え、
  4. hx-on属性の指定(after-request)により、AJAX通信が終わったら、show_dialog()関数を呼び出します。

というものです。

サーバーの対応

サーバーでは、@router.get('/edit_institution/{ID}')で修飾してある関数で、編集するデータを成形して出力しています。

p02.py
@router.get('/edit_institution/{ID}')
def edit_institution(ID:int):
	'''指定されたデータを、編集フォームを作って送信する
	- ID : データの番号
	- return : 詳細データ HTML形式
	'''
	conn = mydb.connect(**config.database)
# (中略)
	# <dialog>の中身作成
	template = env_j2.get_template('html02.j2')
	content = template.render(institution=institution)

	# データを返す
	return HTMLResponse(content=content)

テンプレートとして、html02.j2を使っています。

データ変更

アスタリスクをクリックして出した、データ変更ダイアローグ
08.png
の中身は、html02.j2で作っていて、

<form hx-put="/update_institution" hx-target="#inst_26" hx-swap="outerHTML">
	<table style="width:27rem">
 <!-- 中略 -->
	</table>
	<div class="right_button">
		<input type="reset" value="リセット">
		<input type="submit" value=" 変更 ">
		<input type="button" value="閉じる" onclick="close_dialog()" autofocus>
	</div>
</form>

と、formタグそのものです。
新規入力ダイアローグとは若干違えてあります。
データ変更ダイアローグの、

  1. 「変更」ボタン(type="submit")が押されたら、
  2. hx-put属性により、HTTPのPUTメソッドで、サーバーの/update_institutionにデータを送信し、
  3. hx-target属性により、サーバーからの応答で、idに"inst_26"を持つタグの中身を、
  4. hx-swap属性に指定された方法(outerHTML:指定されたタグのすべて)で書き換えようとしますが、
  5. idに"inst_26"を持つタグには、hx-on属性が付けてあり、内容が書き換えられる前に(before-swap)、サーバーの応答をchange_institution()関数で評価し、
  6. 変更が成功していたら処理を継続、失敗していたら書き換えを中断します。

参考までに、id="inst_26"の内容は以下のとおりです。

<tr id="inst_26" hx-on::before-swap="change_institution(event)">
<!-- 中略 -->
	<td class="pseude_link" hx-get="/edit_institution/26" hx-target="#detail" hx-on::after-request="show_dialog()">*</td>
	<td class="pseude_link" hx-delete="/del_institution/26/5" hx-target="closest tr" hx-swap="delete swap:1s" hx-confirm="データを削除します。削除したデータを戻すことはできません。">x</td>
</tr>

hx-on::before-swapの重要な注意
上記の場合、hx-targetで自身とは違う要素を指定していますので、自身はAJAXの戻り値で書き換えられることはなく、before-swapイベントが発火しません。
hx-on::before-swap=""は、hx-target=""で指定した要素に付ける必要があります。

関連記事一覧

htmxを使ってみた-(1)htmxの基本-
htmxを使ってみた-(2)準備-
htmxを使ってみた-(3)ルート関数-
htmxを使ってみた-(4)htmxを使う-
htmxを使ってみた-(5)HTMLのdialog-
htmxを使ってみた-(6)データの表示-
htmxを使ってみた-(7)データ追加-
htmxを使ってみた-(8)要素の変更-
htmxを使ってみた-(9)ページの再読み込み-
htmxを使ってみた-(10)データの変更-
htmxを使ってみた-(11)データベースの排他制御-
htmxを使ってみた-(12)確認ダイアローグ-
htmxを使ってみた-(13)データ削除-(最終)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?