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

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

ただいまの
回答率

89.05%

Djangoでプルダウン選択時の日時が日本時間で表示されない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 288

swing_swimming

score 12

前提・実現したいこと

研修会の申し込みフォームを作っています。
最初に主催者が研修会の題名を作成し、モデルに保存します。
その後主催者が日時を作成し、別のモデルに保存します。
研修会と日時はForeignKeyで紐づいています。

日時のモデルに保存している日時をリストとして表示し、参加申込者に選択してもらいたいと思っています。
表示される日時は研修会ごとになるようにviewsでフィルターした後、formsに渡しています。

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

参加申込者が日時を選択する際に日時が
主催者が作成した時間とは9時間ずれて表示されてしまいます。
(日本時間ではなく協定世界時で表示されている?)
これを主催者が作成した時間で表示されるようにしたいです。
settings.pyではTIME_ZONE = 'Asia/Tokyo'、USE_TZ = Trueとしています。

該当のソースコード

# models.py
class Training(models.Model):
    title = models.CharField(max_length=150, verbose_name='研修名')
    owner = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name='主催者')

class Training_Date(models.Model):
    target = models.ForeignKey(Training, on_delete=models.CASCADE, verbose_name='対象研修')
    training_date = models.DateTimeField(verbose_name='開催日時')

class Apply(models.Model):
    target = models.ForeignKey(Training, on_delete=models.CASCADE, verbose_name='対象研修')
    apply_user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='参加者')
    apply_date = models.ForeignKey(Training_Date, on_delete=models.CASCADE, verbose_name='参加日時')
# views.py
class DateSelectView(CreateView):
    model = Apply
    form_class = ApplyForm
    template_name = 'training/apply_form.html'
    success_url = reverse_lazy('training:index')

    def get(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        training = Training(pk=self.kwargs['pk'])
        training_date = Training_Date.objects.filter(target=training)
        form = form_class(training_date=training_date)
        params = {
            'form': form,
        }
        return render(request, self.template_name, params)

    def post(self, request, *args, **kwargs):
        ...
# forms.py
class ApplyForm(forms.ModelForm):
    class Meta:
        model = Apply
        fields = ['apply_date', ]

    def __init__(self, training_date, *args, **kwargs):
        super(ApplyForm, self).__init__(*args, **kwargs)
        self.fields['apply_date'].queryset = training_date
<!-- apply_form.html -->
{% extends 'base.html' %}
{% block body %}
<h3>研修申し込み</h3>
<form action="" method="post">
    <table>{{ form.as_table }}</table>
    {% csrf_token %}
    <button type="submit">送信</button>
</form>
{% endblock %}

試したこと

DateSelectViewの段階でreplace(tzinfo=None)としましたが、変わりませんでした。
また、+ datetime.timedelta(hours=9)で9時間足しましたが、変わりませんでした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • llr114

    2020/03/17 03:35

    そもそも登録時の、DB上の時間は正しいものでしょうか?
    ルートディレクトリで、
    python manage.py dbshell
    を実行して、
    select * from テーブル名;
    を実行して、内容を確認してみてください。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 89.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る