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

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

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

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Python

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

Q&A

解決済

2回答

1787閲覧

Python/Django bootstrap-datepickerで日付未指定のときにはフォームにメッセージを表示したい

oskn

総合スコア3

Django

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

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Python

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

0グッド

0クリップ

投稿2020/07/31 08:16

編集2020/07/31 09:08

前提・実現したいこと

Python/Djangoで投稿サイトのようなものを作成しています。
投稿フォームの中に「登録日」という日付を入力する欄を作り、bootstrap-datepickerでカレンダー式の選択機能を実装しています。

現在、該当のフォームでまだ日付を選択していない時には、「2020-07-31 16:55:28」のようにフォームを開いた時点の年月日と時分秒がデフォルトとして表示されています。
日付表示ではなく、「日付を選択してください。」のようなメッセージを表示することは可能でしょうか。
可能であれば、コードの書き方をご教示いただけないでしょうか。

実現したいことのイメージ画像

以下のように、日付未選択時には入力欄内に「ここに日付を入力してください。」のような形でメッセージを表示したいです。
図

該当のソースコード

-- forms.pyより抜粋

Django

1 class Meta: 2 model = Test_input 3 fields = ('created_date') 4 widgets = { 5 'created_date': datetimepicker.DateTimePickerInput( 6 format='%Y-%m-%d %H:%M:%S', 7 options={'locale': 'ja',} 8 ) 9 }

試したこと

forms.pyに以下の1行を追記

attrs={'placeholder': '日付を選択してください。'}

以下のようなコードに書き換えましたが、変わらず「2020-07-31 16:55:28」のような形でフォームをロードした時点の年月日・時分秒が表示されます。

Django

1 class Meta: 2 model = Test_input 3 fields = ('created_date') 4 widgets = { 5 'created_date': datetimepicker.DateTimePickerInput( 6 format='%Y-%m-%d %H:%M:%S', 7 options={'locale': 'ja',}, 8 attrs={'placeholder': '日付を選択してください。'} 9 ) 10 }

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

  • Python 3.6.9
  • Django 2.2

まだコードの勉強を始めたばかりのため、質問内容等わかりにくい箇所があるかと思います。
申し訳ありません。
不明点があればご指摘ください。随時補足させていただきます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

環境の記述や実際の実装の記述が不十分なので、動けばほぼ同じような環境になるようなスクリプトを書いてみました。WindowsだったらLinuxを入れれば動くかも。

■準備(以下が最低必要です)

  • pyenvに必要なもの(ビルドツール※)
  • git
  • wget
  • sqlite3(djangoの実行に必要)

https://github.com/pyenv/pyenv/wiki/common-build-problems

■Ubuntuでの使用例(別の環境では1.の部分が違います)
1.必要なパッケージのインストール

console

1sudo apt install -y build-essential libssl-dev zlib1g-dev libbz2-dev \ 2libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \ 3xz-utils tk-dev libffi-dev liblzma-dev python-openssl git sqlite3

※環境によってはTIME ZONEの設定などが走ります
※gitを普通に使えるように設定してください(ユーザー名とかメアドとか)

2.空ディレクトリに下記2つのスクリプトファイルのみを入れる

  • create_env.sh
  • env.sh

3.操作中のbashからcreate_env.shを実行

console

1. create_snv.sh

※anyenvの初期化ではy

→現在のシェルの環境変数(と一部関数)と空のディレクトリの内容が変わり、ソースが完成します。myappが動く状態でサイトのDebug実行が可能です。
→一旦シェルを抜けると設定した環境変数が消えてしまうので、新しいシェルでは再度環境変数の設定が必要です。env.shを保存したディレクトリで

console

1. env.sh

とすると、anyenvから設定した環境が使えます。

■スクリプトファイル

bash

1# create_env.shとして保存する 2git clone https://github.com/anyenv/anyenv ./.anyenv 3export ANYENV_DEFINITION_ROOT="$PWD/.config/anyenv/anyenv-install" 4export ANYENV_ROOT="$PWD/.anyenv" 5export PATH="$PWD/.anyenv/bin:$PATH" 6eval "$(anyenv init -)" 7anyenv install --init 8 9anyenv install pyenv 10eval "$(anyenv init -)" 11 12pyenv install 3.6.9 13pyenv global 3.6.9 14eval "$(anyenv init -)" 15 16# python3のバージョンに拘らない/他で用意できたならvenvなどでココから始めてもいい 17 18pip install django==2.2 19pip install django-bootstrap4 20pip install django-bootstrap-datepicker-plus 21 22django-admin startproject mysite 23cd mysite 24 25python manage.py startapp myapp 26 27if command -v git; then 28 git init 29 wget -O .gitignore https://github.com/github/gitignore/raw/master/Python.gitignore 30 git add . 31 git commit -m "初期コミット" 32fi 33 34patch -p1 <<EOF 35diff --git a/myapp/forms.py b/myapp/forms.py 36new file mode 100644 37index 0000000..c9f403b 38--- /dev/null 39+++ b/myapp/forms.py 40@@ -0,0 +1,15 @@ 41+from bootstrap_datepicker_plus import DateTimePickerInput 42+from django import forms 43+from .models import Test_input 44+ 45+class TestForm(forms.ModelForm): 46+ class Meta: 47+ model = Test_input 48+ fields = ['created_date'] 49+ widgets = { 50+ 'created_date': DateTimePickerInput( 51+ format='%Y-%m-%d %H:%M:%S', 52+ options={'locale': 'ja',}, 53+ attrs={'placeholder':'日付を選択してください。'} 54+ ) 55+ } 56diff --git a/myapp/models.py b/myapp/models.py 57index 71a8362..1153ba2 100644 58--- a/myapp/models.py 59+++ b/myapp/models.py 60@@ -1,3 +1,5 @@ 61 from django.db import models 62 63 # Create your models here. 64+class Test_input(models.Model): 65+ created_date = models.DateTimeField('作成日') 66diff --git a/myapp/templates/base.html b/myapp/templates/base.html 67new file mode 100644 68index 0000000..b027003 69--- /dev/null 70+++ b/myapp/templates/base.html 71@@ -0,0 +1,13 @@ 72+<html lang="ja"> 73+<head> 74+<title>テスト</title> 75+{% load bootstrap4 %} {# import bootstrap4/bootstrap3 #} 76+{% bootstrap_css %} {# Embed Bootstrap CSS #} 77+{% bootstrap_javascript jquery='full' %} {# Embed Bootstrap JS+jQuery #} 78+{{ form.media }} {# Adds date-picker required JS and CSS #} 79+</head> 80+<body> 81+{% block content %} 82+{% endblock %} 83+</body> 84+ 85diff --git a/myapp/templates/form.html b/myapp/templates/form.html 86new file mode 100644 87index 0000000..7ba17b7 88--- /dev/null 89+++ b/myapp/templates/form.html 90@@ -0,0 +1,12 @@ 91+{% extends 'base.html' %} 92+{% load bootstrap4 %} 93+ 94+{% block content %} 95+<form method="POST"> 96+{% csrf_token %} 97+{% bootstrap_form form %} 98+{% buttons %} 99+<button type="submit" class="btn btn-primary">送信</button> 100+{% endbuttons %} 101+</form> 102+{% endblock %} 103diff --git a/myapp/urls.py b/myapp/urls.py 104new file mode 100644 105index 0000000..80e3d16 106--- /dev/null 107+++ b/myapp/urls.py 108@@ -0,0 +1,7 @@ 109+from django.urls import path 110+ 111+from . import views 112+ 113+urlpatterns = [ 114+ path('', views.formfunc, name='index'), 115+] 116diff --git a/myapp/views.py b/myapp/views.py 117index 91ea44a..2fea9a4 100644 118--- a/myapp/views.py 119+++ b/myapp/views.py 120@@ -1,3 +1,7 @@ 121 from django.shortcuts import render 122+from .forms import TestForm 123 124 # Create your views here. 125+def formfunc(request): 126+ form = TestForm() 127+ return render(request, 'form.html', {'form': form}) 128diff --git a/mysite/settings.py b/mysite/settings.py 129index f875ab4..3f1219f 100644 130--- a/mysite/settings.py 131+++ b/mysite/settings.py 132@@ -31,6 +31,9 @@ ALLOWED_HOSTS = [] 133 # Application definition 134 135 INSTALLED_APPS = [ 136+ 'myapp.apps.MyappConfig', 137+ 'bootstrap4', 138+ 'bootstrap_datepicker_plus', 139 'django.contrib.admin', 140 'django.contrib.auth', 141 'django.contrib.contenttypes', 142@@ -118,3 +121,8 @@ USE_TZ = True 143 # https://docs.djangoproject.com/en/2.2/howto/static-files/ 144 145 STATIC_URL = '/static/' 146+ 147+# Bootstrap 148+BOOTSTRAP4 = { 149+ 'include_jquery': True, 150+} 151diff --git a/mysite/urls.py b/mysite/urls.py 152index facf6e4..1933448 100644 153--- a/mysite/urls.py 154+++ b/mysite/urls.py 155@@ -14,8 +14,9 @@ Including another URLconf 156 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 157 """ 158 from django.contrib import admin 159-from django.urls import path 160+from django.urls import include, path 161 162 urlpatterns = [ 163+ path('myapp/', include('myapp.urls')), 164 path('admin/', admin.site.urls), 165 ] 166EOF

bash

1# env.shとして保存する 2if ! command -v anyenv; then 3 export ANYENV_DEFINITION_ROOT="$PWD/.config/anyenv/anyenv-install" 4 export ANYENV_ROOT="$PWD/.anyenv" 5 export PATH="$PWD/.anyenv/bin:$PATH" 6 eval "$(anyenv init -)" 7fi 8

イメージ説明

■補足
anyenvのインストール場所は通常$HOME/.anyenvですが、ここでは$PWD/.anyenvにしています。
これは

  • 指定ディレクトリ以外をいじりたくない
  • dockerから使う際に都合がいい
  • nodenvなどで同一バージョンでもglobalインストールするパッケージを変えたい(今回使いませんが)

などの都合でそうしています。また、通常はシェルの設定ファイルもいじりますが、ディレクトリごとに環境設定そのものが違うので、スクリプトを手作業でsource実行するアプローチにしています。

※anyenvでは各種シェルに対応していますが、ここでは面倒なのでbashのみに対応しています。

投稿2020/08/06 12:36

編集2020/08/08 21:52
dameo

総合スコア943

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

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

0

Python

1class Meta: 2 model = Test_input 3 fields = ('created_date',) 4 widgets = { 5 'created_date': datetimepicker.DateTimePickerInput( 6 format='%Y-%m-%d %H:%M:%S', 7 options={'locale': 'ja'}, 8 attrs={'placeholder':'日付を選択してください。'} 9 ), 10 } 11```で、いけませんか?

投稿2020/07/31 08:52

編集2020/07/31 09:30
ForestSeo

総合スコア2720

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

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

oskn

2020/07/31 09:00

ご回答に気づかず入れ違いで「試したこと」を追記してしまいました、ご回答いただいたのに申し訳ありません。 頂いたような例は試したのですが想定通りの挙動となりませんでした…。
ForestSeo

2020/07/31 09:29

そうなんですか...すみません。
ForestSeo

2020/07/31 09:31

ちなみに思ったんですが、fields = ('created_date',)のように最後にカンマないとエラー出ますよね。
oskn

2020/08/03 02:08

そうなんですか? エラーというのは、500 Internal Server Errorのことでしょうか。 実は当質問で記載しているコードは、わかりやすくするために質問に関連する項目のみに絞ったほうがいいかと思って少しソースを削ってあり、実際はfileds=()のカッコの中には他にもいくつかの項目名を挙げています。 本来のソースでは、fields = ('created_date', 'creator', 'mail')のような形で複数項目を挙げており、その末尾にはカンマがありませんが、500 Internal Server Errorの発生は確認していません。 画面上はエラーなく正常動作しているように見受けられ、またフォームの項目を埋めて登録ボタンを押すといった操作を行った際にも、裏側でDBに正常にデータ登録ができているようです。 Django 2.2の公式ドキュメント(https://docs.djangoproject.com/ja/2.2/topics/forms/modelforms/)のコードの例などを参照しても、末尾にカンマを付けたりはしていないように思うのですが… たとえば今回私が例示したコードのように、「fields内に指定?する項目が1つだけ」といった場合は、カンマが必要になってくるということでしょうか。
ForestSeo

2020/08/03 02:32 編集

型が変わるはずです。例えば、 type(())→tuple type((1))→str type((1,))→tuple type((1, 2))→tuple と言った感じ strになっちゃいます でも、リストだったら、 type([])→list type([1])→list type([1,])→list type([1, 2])→list になります。 僕はいつもリストを使っています(カンマは嫌)。 https://docs.djangoproject.com/ja/2.2/topics/forms/modelforms/ ↑公式も、リストですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問