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

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

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

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

Python

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

Q&A

解決済

2回答

2892閲覧

【Django】指定の日数後の日付を表示させたい

ysda

総合スコア65

Django

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

Python

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

0グッド

0クリップ

投稿2020/06/20 09:41

編集2020/06/20 12:13

前提・実現したいこと

Python・Djangoを使用して、
「ペットを登録→ボタンを押すことで最終給餌日と次回給餌日が表示される」
というアプリを作成しています。

現在の日付から1週間後の日付を表示させる方法

最終給餌日から1週間後の日付を次回給餌日に自動的に出力されるようにしたいのですが、こちらの実装方法が調べてもわからないという状態でございます。
こちらの実装方法についてご教示いただけますと幸いです。
イメージ説明

該当のソースコード

models.py

class Pet(models.Model): name = models.CharField('ペットの名前', max_length=20) date = models.DateTimeField('日付', auto_now=True) nextdate = models.DateTimeField('次回日付', auto_now=True)

forms.py

class PetCreateForm(forms.ModelForm): class Meta: model = Pet fields = '__all__'

views.py

class UpdateView(generic.UpdateView): model = Pet form_class = PetCreateForm success_url = reverse_lazy('snake:index')

【追記】追加ボタンを押した際にエラー

更新ボタンを押すことで、1週間後の日付が表示されるようにはなったのですが、
追加からペットの追加を行おうとすると、エラーが表示されてしまいます。
おそらく型の問題であるとは思うのですが、こちらの解決方法を調べても対策が検討つかなかったため、解決策をご教示いただけますと幸いです。
なお、そもそも追加画面では日付を表示・取得させたくはないと考えております。
pet_form.htmlという共通のファイルで入力しているため、現在追加画面にも日時が表示される状態になっております。
イメージ説明

該当のソースコード

models.py

class Pet(models.Model): name = models.CharField('ペットの名前', max_length=20) date = models.DateTimeField('日付', auto_now=True) nextdate = models.DateTimeField('次回日付', default=timezone.now()) def save(self, *args, **kwargs): self.nextdate = self.date + datetime.timedelta(weeks=1) super().save(*args, **kwargs)

forms.py

class PetCreateForm(forms.ModelForm): class Meta: model = Pet fields = '__all__'

views.py

#追加画面 class AddView(generic.CreateView): model = Pet form_class = PetCreateForm success_url = reverse_lazy('snake:index') #更新画面 class UpdateView(generic.UpdateView): model = Pet form_class = PetCreateForm success_url = reverse_lazy('snake:index')

pet_form.html

{% extends 'snake/base.html' %} {% block content %} <form action="" method="POST"> <table class="table"> <tr> <th>ペットの名前</th> <td>{{form.name}}</td> <th>最終給餌日時</th> <td>{{form.date}}</td> <th>次回給餌日時</th> <td>{{form.nextdate}}</td> </tr> </table> <button type="submit" class="btn btn-primary">送信</button> {% csrf_token %} </form> {% endblock %}

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

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

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

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

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

guest

回答2

0

ベストアンサー

Python

1import datetime 2from django.utils import timezone 3 4class Pet(models.Model): 5 name = models.CharField('ペットの名前', max_length=20) 6 date = models.DateTimeField('日付', auto_now=True) 7 nextdate = models.DateTimeField(required=False) 8 def save(self, *args, **kwargs): 9 if self.date is None: 10 self.nextdate = timezone.now() + datetime.timedelta(weeks=1) 11 else: 12 self.nextdate = self.date + datetime.timedelta(weeks=1) 13 super().save(*args, **kwargs)

投稿2020/06/20 10:49

編集2020/06/20 20:23
ForestSeo

総合スコア2720

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

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

ysda

2020/06/20 11:41

ご回答ありがとうございます。 こちらのコードで無事、実装できました。 ありがとうございました。
ysda

2020/06/20 12:14

解決したかと思ったら、また別の問題が発生いたしました…。 質問に追記いたしましたので、もしよろしければご回答いただけますと幸いです。
ForestSeo

2020/06/20 20:27 編集

あっすみません、追加したときは self.date が None みたいですね。 回答を編集しました。
ysda

2020/06/21 04:08

ご回答ありがとうございます。 頂いたソースで実装したところ、以下のエラーが表示されました。 __init__() got an unexpected keyword argument 'required' こちらが解決できなかったため、頂いたソースを参考に修正を試みたところ、 うまく実装することができました。 ソースにつきましては、自己解決の部分に記載いたします。 ご協力いただきまして誠にありがとうございました。
guest

0

ご回答いただいたソースを基に、以下で実装することができました。

models.py

class Pet(models.Model): name = models.CharField('ペットの名前', max_length=20) date = models.DateTimeField('日付', auto_now=True) nextdate = models.DateTimeField('次回日付', default=timezone.now()) def save(self, *args, **kwargs): self.nextdate = timezone.now() + datetime.timedelta(weeks=1) super().save(*args, **kwargs)

投稿2020/06/21 04:09

ysda

総合スコア65

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

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

ForestSeo

2020/06/21 04:12 編集

確かに save 時に timezone.now() + datetime.timedelta(weeks=1) でできますね。すみません。
ysda

2020/06/21 04:16

とんでもないです。 私一人では確実にできなかったため、とても助かりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問