Dajngo3.1にて練習がてら勤怠管理システムを作成しています.
やりたいこと
上画面を従業員(=打刻者)が操作して,出勤/退勤ボタンを押すとその時刻をデータベースに登録させるという動作を実現したいのですが,formの入力値をデータベースに登録させるまでの流れが掴めない状態です.
周辺ファイルとか
base
1<!--base.html--> 2 3<!doctype html> 4<html lang="en"> 5<head> 6 <title>TimeCard</title> 7 {% block head %} 8 {% endblock head %} 9</head> 10 11<body> 12 {% block header %} 13 {% endblock header %} 14 {% block content %} 15 {% endblock content %} 16</body> 17</html>
Attendance
1<!--Attendance.html--> 2 3{% extends 'base.html' %} 4 5{% block head %} 6<script> 7 function updateClock() { 8 var now = new Date(); 9 var today = new Date(); 10 var year = today.getFullYear(); 11 var month = today.getMonth() + 1; 12 var week = today.getDay(); 13 var day = today.getDate(); 14 var hour = now.getHours(); 15 var minute = now.getMinutes(); 16 var second = now.getSeconds(); 17 var week_ja = new Array("日", "月", "火", "水", "木", "金", "土"); 18 19 if (hour < 10) hour = "0" + hour; 20 if (minute < 10) minute = "0" + minute; 21 if (second < 10) second = "0" + second; 22 document.getElementById('myClock').innerHTML 23 = year + "年" + month + "月" + day + "日 " + "(" + week_ja[week] + ")" + "<br>" + hour + ":" + minute + ":" + second; 24 } 25 function start() { 26 setInterval("updateClock();", 1000); 27 updateClock(); 28 } 29</script> 30{% endblock head %} 31 32{% block content %} 33 34<body onload="start();"> 35 <div id="myClock" align="center" style="font:bold 20pt Times New Roman;"></div> 36 <hr> 37 38 <div class="container" align="center"> 39 <form action="{% 'submit_attencanceview' %}" method="POST">{% csrf_token %} 40 {{ form.as_p }} 41 <input type="submit" value="出勤" name="arrive"> 42 <input type="submit" value="退勤" name="leave"> 43 </form> 44 </div> 45 46</body> 47{% endblock content %}
forms
1# forms.py 2from django import forms 3 4class StaffAttendanceForm(forms.Form): 5 staff_id = forms.IntegerField() 6
views
1# views.py 2from django.shortcuts import render, redirect 3from django.contrib.auth.models import User 4from .forms import StaffAttendanceForm 5 6def attendanceview(request): 7 template_name = "attendance.html" 8 context = {"form": StaffAttendanceForm()} 9 return render(request, template_name, context) 10 11def submit_attendanceview(request, pk): 12 if request.method == 'POST': 13 if "arrive" in request.POST: 14 print("just arrived" + "& id:" + str(pk)) 15 elif "leave" in request.POST: 16 print("just left" + "& id:" + str(pk)) 17
データベースとしてmodels.py内に
親会社モデル(ParentCompanyModel
),
子会社モデル(ChildCompanyModel
),
従業員モデル(StaffModel
),
勤怠管理モデル(AttendanceModel
)を作成しました.
※今回保存されている内容はadminから直接入力しました.将来的にはユーザー画面上から入力できるように実装していきます.
ParentCompanyModel
1id name 2---------- ---------- 31 Avocado Group 42 Banana Group
ChildCompanyModel
1id name parent_company_id 2---------- ------------------ ----------------- 31 Avocado Solutions 1 42 Avocado Engineering 1 53 Banana Solutions 2 64 Banana Engineering 2
StaffModel
1id name place employee_id regular_start regular_finish 2---------- ---------- ------------ ------------ ------------- -------------- 31 Ichiro Avocado Solutions 12345 8:30 17:30 42 Jiro Banana Engineering 23456 10:00 19:00
AttendanceModel
1id in_out date time correcotr arrive_correct leave_correct company_id staff_id 2---------- ---------- ---------- ---------- ---------- -------------- ------------- ---------- ---------- 31 0 2021-04-14 08:15:00 1 1 42 0 2021-04-14 09:45:00 4 2 53 1 2021-04-14 17:45:00 1 1 64 1 2021-04-14 19:15:00 4 2 7* in_outに関しては0が出勤,1が退勤です
ためしたこと
formのボタンを押したときにsubmit_attendanceviewを実行してほしいということで,attendance.htmlのformのactionの#
の部分の代わりに{% 'submit_attencanceview' %}
としたところ,下記のようにエラーします.
ErrorContent
1TemplateSyntaxError at /attendance/ 2Invalid block tag on line 38: ''submit_attencanceview'', expected 'endblock'. Did you forget to register or load this tag?
この場合だと,Staff id
に"12345"を入力して"出勤"ボタンを押すと,
- URL遷移せずに
submit_attendanceview
に"12345", "出勤"を渡してDBに保存し, - formをキレイにして次の人がまた打刻できる状態にする
ということを実行したいです.
まとめると,
①ボタンを押すとformの内容を取得してviews.py内の特定の関数を呼び出し実行する方法
②views.py内の関数でDBに保存する方法
③URL遷移せず処理し,formをキレイにする方法
④Staff idで呼び出すのではなく,プルダウンリストから自身の名前を選択する場合のviewの実装方針
のどれかをお教えいただきたいです.(④は将来的にぶち当たる壁であろうのでついでに,,,)
不足している情報等あれば補足しますので,お申し付けください.
(Djangoは周辺ファイルがおおくて状況を伝えにくいですね,,,)
どれか一つでも大変助かりますので,ご回答の程,どうぞよろしくお願いいたします.
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/27 23:50