djangoの日付入力をカレンダーで行う

djangoの日付入力をカレンダーで行う

この記事を参考にした

完成品はこんな感じ

まずpip installから

pip install django-bootstrap-datepicker-plus


settings.pyに記述

INSTALLED_APPS = [
    # Add the following
    'bootstrap_datepicker_plus',
]


models.py

class Item(models.Model):

    sample_1 = models.DateField(
        verbose_name='サンプル項目1 日付',
        blank=True,
        null=True,
    )

    # サンプル項目2 日付時刻
    sample_2 = models.DateTimeField(
        verbose_name='サンプル項目2 日付時刻',
        blank=True,
        null=True,
    )

    # サンプル項目3 時刻
    sample_3 = models.TimeField(
        verbose_name='サンプル項目3 日時',
        blank=True,
        null=True,
    )

    # サンプル項目4 期間 開始日
    sample_4_start = models.DateField(
        verbose_name='サンプル項目4 期間 開始日',
        blank=True,
        null=True,
    )

    # サンプル項目4 期間 終了日
    sample_4_end = models.DateField(
        verbose_name='サンプル項目4 期間 終了日',
        blank=True,
        null=True,
    )


forms.py

import bootstrap_datepicker_plus as datetimepicker
from django import forms

from .models import Item


class ItemForm(forms.ModelForm):

    class Meta:
        model = Item
        fields = ('sample_1', 'sample_2', 'sample_3', 'sample_4_start', 'sample_4_end')
        widgets = {
            'sample_1': datetimepicker.DatePickerInput(
                format='%Y-%m-%d',
                options={
                    'locale': 'ja',
                    'dayViewHeaderFormat': 'YYYY年 MMMM',
                }
            ),

            'sample_2': datetimepicker.DateTimePickerInput(
                format='%Y-%m-%d %H:%M:%S',
                options={
                    'locale': 'ja',
                    'dayViewHeaderFormat': 'YYYY年 MMMM',
                }
            ),

            'sample_3': datetimepicker.TimePickerInput(
                format='%H:%M:%S',
                options={
                    'locale': 'ja',
                }

            ),

            'sample_4_start': datetimepicker.DatePickerInput(
                format='%Y-%m-%d',
                options={
                    'locale': 'ja',
                    'dayViewHeaderFormat': 'YYYY年 MMMM',
                }
            ).start_of('期間'),

            'sample_4_end': datetimepicker.DatePickerInput(
                format='%Y-%m-%d',
                options={
                    'locale': 'ja',
                    'dayViewHeaderFormat': 'YYYY年 MMMM',
                }
            ).end_of('期間'),
        }

warningでformatが使えなくなるかもと言われたのでformat=’%Y-%m-%d’,は消しても良いかも。

format=’%Y-%m-%d %H:%M:00′,のようにカスタマイズすることで秒の入力を消せる。formatを消すとうまくカレンダーが表示されなかった。

templateの上部にこれを入れておく

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>

<link href="/static/bootstrap_datepicker_plus/css/datepicker-widget.css" type="text/css" media="all" rel="stylesheet">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment-with-locales.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script>
<script type="text/javascript" src="/static/bootstrap_datepicker_plus/js/datepicker-widget.js"></script> 


htmlには以下のように{{ form.media }}を入れることで勝手に反映してくれる。

{% extends "base.html" %}

{% load static %}


{% block title %}Reservations{% endblock %}

{% block extracss %}
<link href="{% static 'css/mystyles.css' %}" rel="stylesheet" />
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<link href="/static/bootstrap_datepicker_plus/css/datepicker-widget.css" type="text/css" media="all" rel="stylesheet">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment-with-locales.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script>
<script type="text/javascript" src="/static/bootstrap_datepicker_plus/js/datepicker-widget.js"></script> 
{% endblock %}


{% block main %}
<body style="margin: 0; padding: 0; font-family: Arial, sans-serif; background-color: #f2f2f2;">
    <div class="container">
        <div class="row">
            <div class="col-lg-3"></div>
            <div class="col-lg-6">
                <div class="custom-container">
                    {{ form.media }}
                    <form class="form" action="" method="POST">
                        {% csrf_token %}
                        <h2>Reservation</h2>
                        {% for fields in form %}
                        <div class="form-group">
                            <label for="">{{ fields.label_tag }}</label>
                            {{ fields }}
                        </div>
                        {% endfor %}
                        <button type="submit" class="btn btn-primary">Reserve</button>
                    </form>
                    <div class="signup mt-5">
                        <p>Don't have an account yet? <a href="{% url 'accounts:signup' %}">Sign Up</a></p>
                    </div>
                </div>
                <div class="mb-5 text-center">
                    <button type="button" class="btn btn-default" style="margin-left:50%;" onclick="history.back()">戻る</button>
                </div>
            </div>
            <div class="col-lg-3"></div>
        </div>
    </div>
</body>

{% endblock %}

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です