質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.37%
Django

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

Python

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

Q&A

解決済

1回答

992閲覧

Django-python 登録日から次回の登録日を表示させたい

art35

総合スコア13

Django

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

Python

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

0グッド

0クリップ

投稿2021/08/24 02:55

編集2021/08/25 03:04

前提・実現したいこと

calibration_dateをtodayなどで入力してその何年後かをnext_calibration_dateに表示させる。
選択したcalibration_typeによってCALIBRATION_CHOICESから参照して次の指定日を自動で入力。管理画面でreadonlyで表示させる。
readonly→これはadminでできているので多分いいと思ってます。

python

1_models.py 2 3 4CALIBRATION_CHOICES = ( 5 (0,'1年校正'), 6 (1,'2年校正'), 7 (2,'5年校正'), 8 (3,'10年校正'), 9) 10 11SPEC3_CHOICES = ( 12 (1, 'A'), 13 (2, 'D'), 14) 15 16 17class InsLedger(models.Model): 18 measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=1) 19 measuring_tool = models.ForeignKey(Device, on_delete=models.CASCADE) 20 ins_num = models.CharField(max_length=10) 21 calibration_type = models.IntegerField(choices=CALIBRATION_CHOICES)#校正期間 22 calibration_date = models.DateField(default=now)#datetime.datetime.now()) 23 next_calibration_date = models.DateField() 24 serial_num = models.CharField(max_length=20, null=True, blank=True, default='') 25 product_num = models.ForeignKey(Product_num, on_delete=models.CASCADE)#対象品番 26 team = models.ForeignKey(TeamModel, on_delete=models.CASCADE, related_name='teams1') 27 line = models.ForeignKey(LineModel, on_delete=models.CASCADE, related_name='lines1') 28 useapp = models.ForeignKey(Useapp, on_delete=models.CASCADE)#使用用途 29 spec1 = models.ForeignKey(Spec1, on_delete=models.CASCADE)#最小目盛 30 spec2 = models.ForeignKey(Spec2, on_delete=models.CASCADE)#測定範囲 31 spec3 = models.IntegerField(choices=SPEC3_CHOICES)#表示 32 check_items = models.ForeignKey(Check_Items, on_delete=models.CASCADE)#日常点検項目 33 34 def save(self, *args, **kwargs): 35 auto_now = kwargs.pop('next_calibration_date_auto_now', True) 36 if auto_now: 37 if self.calibration_type == CALIBRATION_CHOICES[0]: 38 calibration_span = 1 39 elif self.calibration_type == CALIBRATION_CHOICES[1]: 40 calibration_span = 2 41 elif self.calibration_type == CALIBRATION_CHOICES[2]: 42 calibration_span = 5 43 elif self.calibration_type == CALIBRATION_CHOICES[3]: 44 calibration_span = 10 45 46 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span) 47 48 super().save(*args, **kwargs) 49 50 def __str__(self): 51 return str(self.measuring_tool)

python

1_admin.py 2 3class InsLedgerAdmin(admin.ModelAdmin): 4 list_display = ('measuring_ins_group','measuring_tool','ins_num','team','line','calibration_date', 'next_calibration_date') 5 list_filter = ["measuring_ins_group"] 6 search_fields = ['measuring_ins_group'] 7 readonly_fields = ('next_calibration_date',) 8admin.site.register(InsLedger, InsLedgerAdmin) 9

runserverを動かして登録したところ以下のようなメッセージが出る。

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

UnboundLocalError at /admin/ins_ledger1/insledger/add/ local variable 'calibration_span' referenced before assignment Django Version: 3.2.5 Exception Type: UnboundLocalError Exception Value: local variable 'calibration_span' referenced before assignment Exception Location: ―--/ins_ledger1/models.py, line 72, in save 72 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span)

試したこと

global変数での指定。

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

どなたかわかる方ご教授お願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

問題点がわかりましたので記載しておきます。
もとはcalibration_typeはIntegerFieldを使用していなくchoices=は使用していませんでした。
そのため、calibration_typeの中身は('1年校正')というだけでしたが、choicesを使用したため、
(0,'1年校正')と変更しました。

その際に本来であればdef saveのif文でCALIBRATION_CHOICESを指定するときに
CALIBRATION_CHOICES[0][0]:のようにタプルの2重構造にしていなかったために
今回のエラーが発生していました。
参考までに。

python

1_models.py 2CALIBRATION_CHOICES = ( 3 (0,'1年校正'), 4 (1,'2年校正'), 5 (2,'5年校正'), 6 (3,'10年校正'), 7) 8 9SPEC3_CHOICES = ( 10 (1, 'A'), 11 (2, 'D'), 12) 13 14 15class InsLedger(models.Model): 16 measuring_ins_group = models.IntegerField(choices=MEASURING_INS_GROUP_CHOICES,default=1) 17 measuring_tool = models.ForeignKey(Device, on_delete=models.CASCADE) 18 ins_num = models.CharField(max_length=10) 19 calibration_type = models.IntegerField(choices=CALIBRATION_CHOICES)#校正期間 20 calibration_date = models.DateField(default=now)#datetime.datetime.now()) 21 next_calibration_date = models.DateField() 22 serial_num = models.CharField(max_length=20, null=True, blank=True, default='') 23 product_num = models.ForeignKey(Product_num, on_delete=models.CASCADE)#対象品番 24 team = models.ForeignKey(TeamModel, on_delete=models.CASCADE, related_name='teams1') 25 line = models.ForeignKey(LineModel, on_delete=models.CASCADE, related_name='lines1') 26 useapp = models.ForeignKey(Useapp, on_delete=models.CASCADE)#使用用途 27 spec1 = models.ForeignKey(Spec1, on_delete=models.CASCADE)#最小目盛 28 spec2 = models.ForeignKey(Spec2, on_delete=models.CASCADE)#測定範囲 29 spec3 = models.IntegerField(choices=SPEC3_CHOICES)#表示 30 check_items = models.ForeignKey(Check_Items, on_delete=models.CASCADE)#日常点検項目 31 32 def save(self, *args, **kwargs): 33 auto_now = kwargs.pop('next_calibration_date_auto_now', True) 34 if auto_now: 35 if self.calibration_type == CALIBRATION_CHOICES[0][0]: 36 calibration_span = 1 37 elif self.calibration_type == CALIBRATION_CHOICES[1][0]: 38 calibration_span = 2 39 elif self.calibration_type == CALIBRATION_CHOICES[2][0]: 40 calibration_span = 5 41 elif self.calibration_type == CALIBRATION_CHOICES[3][0]: 42 calibration_span = 10 43 44 self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span) 45 super().save(*args, **kwargs)

投稿2021/08/25 04:20

art35

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問