🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

10824閲覧

TypeErrorを解消したい

nonono333

総合スコア5

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/10 14:48

編集2019/11/14 14:33

前提・実現したいこと

python,djangoで出退勤時間を管理するアプリを作りたいと思っています。
%H:%M:%Sの形で入力して、それを反映し管理アプリです。
以下のソースでウェブページから更新ボタンを押下するとTypeErrorが出ましたので、
それを解消したいです。

データの型の問題だと考えているのですが、
①form.pyに問題があるのでしょうか。
②model.pyに問題があるのでしょうか。
③あるいは他に原因があるのでしょうか
お分かりの方がおりましたら、ご教示いただきたいです。

発生している問題・エラーメッセージ

match = datetime_re.match(value)
TypeError: expected string or bytes-like object

該当のソースコード

model

1from django.db import models 2from django.contrib.auth import get_user_model 3from django.contrib.auth.models import User 4#import datetime as dt 5from django.utils import timezone 6# Create your models here. 7class SubmitAppsite(models.Model): 8 class Meta: 9 db_table = 'appsite' 10 STATE = ( 11 (1, '正常'), 12 (2, '遅刻'), 13 (3, '欠勤'), 14 (4, '早退'), 15 (5, '休日'), 16 (6, 'そのほか'), 17 ) 18 IN_OUT = ( 19 (1, '出勤'), 20 (0, '退勤'), 21 ) 22 23 staff = models.ForeignKey(get_user_model(), verbose_name="社員", on_delete=models.CASCADE, default=None) 24 in_outtime = models.TimeField(verbose_name="出退勤時間", default=None) 25 state = models.IntegerField(verbose_name='状態', choices=STATE, default=None) 26 in_out = models.IntegerField(verbose_name='IN/OUT', choices=IN_OUT, default=None) 27 time = models.DateTimeField(verbose_name="更新時間") 28 date = models.DateField(verbose_name='更新日')

view

1from django.shortcuts import render, redirect 2from django.views import View 3from django.contrib.auth.mixins import LoginRequiredMixin 4from .models import SubmitAppsite 5from .forms import SubmitAppsiteForm 6from datetime import datetime 7from django.utils import timezone 8# Create your views here. 9 10class IndexView(LoginRequiredMixin, View): 11 def get(self, request): 12 form = SubmitAppsiteForm 13 context = { 14 'form': form, 15 "user": request.user, 16 } 17 return render(request, 'appsite/index.html', context) 18index = IndexView.as_view() 19 20 21class ResultView(View): 22 23 def post(self, request): 24 form = SubmitAppsiteForm(request.POST) 25 now = datetime.now() 26 month = now.month 27 day = now.day 28 hour = now.hour 29 minute = now.minute 30 31 obj = form.save(commit=False) 32 obj.in_outtime = request.POST["in_outtime"] 33 obj.state = request.POST["state"] 34 obj.in_out = request.POST["in_out"] 35 obj.staff = request.user 36 obj.date = datetime.now().date() 37 obj.time = datetime.now().time() 38 obj.save() 39 40 if request.POST["in_out"] == '1': 41 comment = str(month) + "月" + str(day) +"日" + str(hour) + "時" + str(minute) + "分" + "出勤確認しました。今日も頑張りましょう!" 42 else: 43 comment = str(month) + "月" + str(day) +"日" + str(hour) + "時" + str(minute) + "分" + "退勤確認しました。お疲れ様でした(^-^)!" 44 context = { 45 'state': SubmitAppsite.STATE[int(obj.state)-1][1], 46 'comment': comment, 47 } 48 return render(request, 'appsite/result.html', context) 49result = ResultView.as_view()

form

1class SubmitAppsiteForm(forms.ModelForm): 2 class Meta: 3 model = SubmitAppsite 4 fields = ('in_outtime') 5 widgets = { 6 'in_outtime': datetimepicker.DatePickerInput( 7 format='%H:%M:%S', 8 ), 9}

html

1{{ form.media }} 2<p>出退勤時間:<input type="hidden" name="in_outtime">{{ form.in_outtime }}</p> 3<p><input class="btn btn-primary" type="submit" value="更新"></p>

試したこと

1.model.pyの in_outtime = models.TimeFieldの
TimeFieldをDateTimeFieldに変えて更新するとValueErrorとなりました。

2.form.pyを以下のように変更してみましたが、やはりTypeErrorとなりました。

form

1format='%Y-%m-%d %H:%M:%S',

補足情報(FW/ツールのバージョンなど)

**DBはsqlite。**bootstrap-datetimepickerを使用しています。ソースは抜粋。
調べてみますとSQLiteでは日付・時刻・日付時刻は単なる文字列として扱われるとあったので、
form.pyかview.pyで入力した情報を文字列として扱えれば解決できるのかと考え、
調べましたが分かりませんでした。

###追記(エラーの行が、提示されているコードの中に無い)
エラーは下記ようになっていました。

File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\utils\dateparse.py", line 106, in parse_datetime
match = datetime_re.match(value)
TypeError: expected string or bytes-like object

dateparse

1def parse_datetime(value): 2 match = datetime_re.match(value) 3 if match: 4 kw = match.groupdict() 5 kw['microsecond'] = kw['microsecond'] and kw['microsecond'].ljust(6, '0') 6 tzinfo = kw.pop('tzinfo') 7 if tzinfo == 'Z': 8 tzinfo = utc 9 elif tzinfo is not None: 10 offset_mins = int(tzinfo[-2:]) if len(tzinfo) > 3 else 0 11 offset = 60 * int(tzinfo[1:3]) + offset_mins 12 if tzinfo[0] == '-': 13 offset = -offset 14 tzinfo = get_fixed_timezone(offset) 15 kw = {k: int(v) for k, v in kw.items() if v is not None} 16 kw['tzinfo'] = tzinfo 17 return datetime.datetime(**kw)

###追記(このvalueという変数はいったいナニモノ)
エラーをすべて下記に追記しました。
ただ大変申し訳ありません。
valueがいったい何者なのか、私には分かりませんでした。
またparse_datetime関数の呼び元のソースがどれに当たるのか、分かりませんでした。
もっと勉強してから質問しようと思います。
コメントありがとうございました。


File "D:\01_勉強用\03_python\work\webapp\appsite\views.py", line 39, in post
obj.save()
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\base.py", line 741, in save
force_update=force_update, update_fields=update_fields)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\base.py", line 779, in save_base
force_update, using, update_fields,
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\base.py", line 870, in save_table
result = self.do_insert(cls.base_manager, using, fields, update_pk, raw)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\base.py", line 908, in do_insert
using=using, raw=raw)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\query.py", line 1186, in insert
return query.get_compiler(using=using).execute_sql(return_id)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\sql\compiler.py", line 1334, in execute_sql
for sql, params in self.as_sql():
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\sql\compiler.py", line 1278, in as_sql
for obj in self.query.objs
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\sql\compiler.py", line 1278, in <listcomp>
for obj in self.query.objs
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\sql\compiler.py", line 1277, in <listcomp>
[self.prepare_value(field, self.pre_save_val(field, obj)) for field in fields]
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\sql\compiler.py", line 1218, in prepare_value
value = field.get_db_prep_save(value, connection=self.connection)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\fields_init
.py", line 789, in get_db_prep_save
return self.get_db_prep_value(value, connection=connection, prepared=False)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\fields_init
.py", line 1431, in get_db_prep_value
value = self.get_prep_value(value)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\fields_init
.py", line 1410, in get_prep_value
value = super().get_prep_value(value)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\fields_init
.py", line 1270, in get_prep_value
return self.to_python(value)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\db\models\fields_init
.py", line 1371, in to_python
parsed = parse_datetime(value)
File "D:\01_勉強用\03_python\work\webapp\myvenv\lib\site-packages\django\utils\dateparse.py", line 106, in parse_datetime
match = datetime_re.match(value)
TypeError: expected string or bytes-like object


###追記(views.pyについて)
上記のveiwをすべて記載しました。(そのため以前までのものは消えています)
またmodelもすべて記載しています、

このファイルはnonono333さんが編集したものでまちがいないでしょうか。

はい。こちら(リンク)を参考に作成し、自身で時刻を入力する機能を追加するのために編集しました。

入力者によって時刻の入力がバラバラになるのを嫌い、またフォーマットを制限しないとVauleErrorが出たため
こちらで入力方法を制限したく、bootstrap-datetimepickerを使用しました。
その際はこちらを参考リンクに時刻を入力する形にしました。

###追記(日時のフォーマットに従っていないこと)

日時のフォーマットに従っていないことが原因であると考えられます。

上記指摘をいただき、日次が入る個所を一つ一つコメントアウトして実行してみましたところ、下記の個所をコメントアウトするとエラーが起こらず、無事に更新されました。

veiw

1 #obj.time = datetime.now().time() 2

model

1 #time = models.DateTimeField(verbose_name="更新時間")

また下記のように修正し実行すると問題なく更新されました。

veiw

1 obj.time = datetime.now().time() 2

model

1 time = models.TimeField(verbose_name="更新時間") 2  #Dateを削除

上記の結果から考えますと
Datetime型が入るべきところにtime型が入ろうとしていてためTypwerrorとり、
time型に修正したらエラーが起きなくなったと考えています。

最初に挙げていた抜粋のソースがエラーの原因ではなく、違う箇所が原因のようでした。
回答のために読んでいただいたのに見当違いの個所を記載してしまい、申し訳ありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2019/11/10 14:54

エラーの行が、提示されているコードの中に無いようですが、コードはそれで全部でしょうか
kazto

2019/11/10 22:11

parse_datetime関数の呼び元のソースを追記してください。
guest

回答2

0

ベストアンサー

"D:\01_勉強用\03_python\work\webapp\appsite\views.py", line 39, in post obj.save()

上記のコードを追記お願いします。このファイルはnonono333さんが編集したものでまちがいないでしょうか。

投稿2019/11/11 22:56

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazto

2019/11/12 12:16

エラーは、ResultViewクラスpostメソッド内、`obj.save()` をきっかけに発生しています。 そしてエラーの内容から推測するに、 obj.in_outtime = request.POST["in_outtime"] obj.state = request.POST["state"] obj.in_out = request.POST["in_out"] のいずれかが空であるなど、日時のフォーマットに従っていないことが原因であると考えられます。上記のPOST内容をログに出力するなどして確認してみてはいかがでしょうか。
guest

0

出ているエラーは、

match = datetime_re.match(value)

この valueが、想定されている型と違う、というエラーです
#ここに入るべきはstringかバイト列か、とエラーメッセージに出てますね

このvalueという変数はいったいナニモノでしょうか。
parse_datetime関数の引き数ですんで、この関数を呼び出しているコードがわからないとどうしようもありません。

投稿2019/11/11 00:03

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問