[PYTHON] Django-Eingabeprüfung und Kalendertyp-Eingabe

Nachdem das Skelett zu einem gewissen Grad erstellt wurde, haben wir die Eingabeunterstützungsfunktion in Frage gestellt, damit sie bei tatsächlicher Verwendung bequem verwendet werden kann. Die Vermeidung fehlerhafter Eingaben ist wichtig für den Systemaufbau.

Zunächst dauerte es mehr als 10 Stunden, aber es gelang mir, die Eingabeprüfung durchzuführen. Die Verschiebung erfolgt vom 21. zum nächsten 20., und es wurde gesagt, dass die Anfrage vom 5. gehört und am 10. verteilt wurde. Wenn sie also den 5. überschreitet, wird das Datum vor dem 20. des nächsten Monats sein Ich habe es unmöglich gemacht, etwas einzugeben.

Die Kalendereingabe ist noch nicht schön, aber ich habe sie implementiert.

schedule/forms.py


from django import forms
from .models import Schedule, Shisetsu, Shift, KibouShift
import datetime
from datetime import timedelta
from datetime import datetime as dt
from django.core import validators
from django.contrib.auth.models import User
from django.core.validators import MaxValueValidator,MinValueValidator
from dateutil.relativedelta import relativedelta
from bootstrap_datepicker_plus import DatePickerInput
import bootstrap_datepicker_plus as datetimepicker

class ScheduleUpdateForm(forms.ModelForm):
    class Meta:
        model = Schedule
        fields = ('shift_name_1', 'shisetsu_name_1', 'shift_name_2', 'shisetsu_name_2', 'shift_name_3', 'shisetsu_name_3','shift_name_4', 'shisetsu_name_4', 'day_total_worktime')
    
    #Wenn Schicht 1 geschlossen ist, bleibt Einrichtung 1 leer
    #def clean(self):
    #    cleaned_data = super().clean()
    #    shift_name_1 = self.cleaned_data['shift_name_1']
    #    shisetsu_name_1 = self.cleaned_data['shisetsu_name_1']
    #    if str(shift_name_1) == "Geschlossen":
    #        if shisetsu_name_1 != None:
    #            raise forms.ValidationError("Während der Ferien ist keine Eingabe der Einrichtung erforderlich")
    #        return shift_name_1

class KibouShiftForm(forms.ModelForm):
    class Meta:
        model = KibouShift
        fields = ('shift_name_1', 'shisetsu_name_1', 'shift_name_2', 'shisetsu_name_2', 'shift_name_3', 'shisetsu_name_3','shift_name_4', 'shisetsu_name_4')


class KibouUpdateForm(forms.ModelForm):
    class Meta:
        model = KibouShift
        fields = ('user', 'date', 'shift_name_1', 'shisetsu_name_1', 'shift_name_2', 'shisetsu_name_2', 'shift_name_3', 'shisetsu_name_3', 'shift_name_4', 'shisetsu_name_4')
        widgets = {
            'date': datetimepicker.DatePickerInput(
            format='%Y-%m-%d',
            options={
                'locale': 'ja',
                'dayViewHeaderFormat': 'JJJJ Jahr MMMM',
                'ignoreReadonly': True,
                'allowInputToggle': True,
                }
            ),
        }
    def clean_date(self):
        dt_now = datetime.datetime.now()
        dt_date = self.cleaned_data.get('date')
        #Geben Sie erst nach dem 20. als 5. ein
        if dt_now.day > 5:
            startdate = datetime.date(dt_now.year,dt_now.month,20) + relativedelta(months=1)
            if dt_date < startdate:
                raise forms.ValidationError(
                "Ich kann nicht teilnehmen, da die Frist abgelaufen ist",
                )
        else:
            startdate = datetime.date(now.year,now.month,20)
            if dt_date < startdate:
                raise forms.ValidationError(
                "Ich kann nicht teilnehmen, da die Frist abgelaufen ist",
                )
        return self.cleaned_data.get('date')
    
class KibouCreateForm(forms.ModelForm):
        class Meta:
            model = KibouShift
            fields = ('user', 'date', 'shift_name_1', 'shisetsu_name_1', 'shift_name_2', 'shisetsu_name_2', 'shift_name_3', 'shisetsu_name_3', 'shift_name_4', 'shisetsu_name_4')
            widgets = {
                'date': datetimepicker.DatePickerInput(
                format='%Y-%m-%d',
                options={
                    'locale': 'ja',
                    'dayViewHeaderFormat': 'JJJJ Jahr MMMM',
                    'ignoreReadonly': True,
                    'allowInputToggle': True,
                    }
                ),
            }
        def clean_date(self):
            dt_now = datetime.datetime.now()
            dt_date = self.cleaned_data.get('date')
            #Geben Sie erst nach dem 20. als 5. ein
            if dt_now.day > 5:
                startdate = datetime.date(dt_now.year,dt_now.month,20) + relativedelta(months=1)
                if dt_date < startdate:
                    raise forms.ValidationError(
                    "Ich kann nicht teilnehmen, da die Frist abgelaufen ist",
                    )
            else:
                startdate = datetime.date(now.year,now.month,20)
                if dt_date < startdate:
                    raise forms.ValidationError(
                    "Ich kann nicht teilnehmen, da die Frist abgelaufen ist",
                    )
            return self.cleaned_data.get('date')

schedule/kiboushift/update.html


{% extends 'schedule/kiboushift/base.html' %}
{% load static %}
{% block customcss %}
<link rel="stylesheet" type="text/css" href ="{% static 'schedule/kiboushift/update.css' %}">
{% endblock customcss %}

{% block header %}
<div class="jumbotron jumbotron-fluid">
    <div class="container">
      <h1 class="display-4">Gewünschte Schichtkorrektur</h1>
      <p class="lead"></p>
    </div>
  </div>
{% endblock header %}

{% block content %}
<form action="" method="POST">{% csrf_token %}
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
<link href="//cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<link href="//cdn.bootcss.com/bootstrap-datetimepicker/4.17.44/css/bootstrap-datetimepicker.min.css" rel="stylesheet">
<script src="//cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
<script src="//cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="//cdn.bootcss.com/moment.js/2.17.1/moment.min.js"></script>
<script src="//cdn.bootcss.com/bootstrap-datetimepicker/4.17.44/js/bootstrap-datetimepicker.min.js"></script>
<div class="container">
  {{ form.media }}
  {{ form.as_p }}
  {% csrf_token %}
    <input class="btn btn-primary" type="submit" value="aktualisieren">
    <a href="{% url 'schedule:KibouList' %}" class="btn-secondary btn active">Rückkehr</a></p>
    {% for shift in shift_object %}
        {% if shift.name != "Geschlossen" and shift.name != "Ja" %}
            {{ shift.name }} : {{ shift.start_time }}~{{ shift.end_time }}
        {% endif %}
    {% endfor %}
</div>
</form>
{% endblock content %}

Es stellte sich heraus, dass es so etwas war. Kalendereingabe image.png

Fehler bei der Eingabeprüfung

image.png

Als ich den Kalender betrat, wurde der Eingabebereich plötzlich erweitert und ich habe versucht, ihn mit CSS zu reparieren, aber er kann angewendet werden ...

Ich möchte die Auswahl des Mitarbeiternamens als Taro Yamada anzeigen, indem ich Nachname und Vorname anstelle von Benutzername kombiniere, aber ich habe keine Ahnung, wie ich das lösen soll ...

Das auch. Ich habe fast 3 Stunden lang recherchiert, aber ich kann es nicht leicht finden ... Ich werde dir eine Frage stellen (⌒∇⌒)

Wenn Sie eine Frage zu Qiita stellen, sind alle bisher gelöst. Vielen Dank

Recommended Posts

Django-Eingabeprüfung und Kalendertyp-Eingabe
Django-Eingabeprüfung und Kalendertyp-Eingabe
Django Versionsprüfung
Installieren Sie Python 3.7 und Django 3.0 (CentOS)
Django-Dateneingabe dumpdata loaddata
Django Zeitzoneneinstellung und Spracheinstellung
Erstellen und listen Sie Django-Modelle auf
[Django] Organisiere Befehle und Rollen
[Anmerkung] Django-Projekterstellung und Terminologie
Legen Sie Platzhalter in Eingabefeldern in Django fest
HTTPS mit Django und Let's Encrypt
Überprüfen und verschieben Sie das Verzeichnis in Python