[PYTHON] Transition vers l'écran de mise à jour avec le Django a tag

Nous implémenterons la transition de la planification en cours d'édition à l'écran de mise à jour et le retour à l'écran des variantes.

Tout d'abord, je vais créer un lien avec l'heure de la journée dans le tableau des horaires comme une balise

schedule/month.html


{% extends 'schedule/base.html' %}
{% block header %}
{% endblock header %}

{% block content %}
<table class="table table-striped table-bordered">
<thead>
    <tr align="center" class="info">    <!--Date-->
        <th rowspan="2"></th>
        {% for item in calender_object %}
                <th class="day_{{ item.date }}">{{ item.date | date:"d" }}</th>
        {% endfor %}
    <tr align="center" class="info">   <!--journée-->
        {% for item in youbi_object %}
            <th class="day_{{ item.date }}">{{ item }}</th>
        {% endfor %}
    </tr>
</thead>
<tbody>
{% for staff in user_list %}
    <tr align="center">
    <th rowspan="1" class="staff_name" staff_id="{{ staff.staff_id }}" width="200" >{{ staff.last_name }} {{ staff.first_name }}</th>  <!--staff_Élément id utilisé dans js-->
            {% for item in object_list %} 
                {% if item.user|stringformat:"s" == staff.username|stringformat:"s" %}<!--Si le nom d'utilisateur est le même-->
                    <td class="day" id="s{{ staff.id }}d{{ item.date }}"> 
                        {% if item.shift_name_1 != None %}
                            {% if item.shift_name_1|stringformat:"s" == "Oui" or item.shift_name_1|stringformat:"s" == "Fermé" %}
                                {{ item.shift_name_1 }}
                            {% else %}
                                {% for shisetsu in shisetsu_object %}
                                    {% if item.shisetsu_name_1|stringformat:"s" == shisetsu.name|stringformat:"s" %}                          
                                        <span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_1 }}</span>
                                    {% endif %}
                                {% endfor %} 
                            {% endif %}    
                        {% endif %}
                {% if item.shift_name_2 != None %}
                    {% if item.shift_name_2|stringformat:"s" == "Oui" or item.shift_name_2|stringformat:"s" == "Fermé" %}
                        {{ item.shift_name_2 }}
                    {% else %}
                        {% for shisetsu in shisetsu_object %}
                            {% if item.shisetsu_name_2|stringformat:"s" == shisetsu.name|stringformat:"s" %}                          
                                    <span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_2 }}</span>
                            {% endif %}
                        {% endfor %} 
                    {% endif %}    
                {% endif %}
                {% if item.shift_name_3 != None %}
                    {% if item.shift_name_3|stringformat:"s" == "Oui" or item.shift_name_3|stringformat:"s" == "Fermé" %}
                        {{ item.shift_name_3 }}
                    {% else %}
                        {% for shisetsu in shisetsu_object %}
                            {% if item.shisetsu_name_3|stringformat:"s" == shisetsu.name|stringformat:"s" %}                          
                                <span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_3 }}</span>
                            {% endif %}
                        {% endfor %} 
                    {% endif %}    
                {% endif %}
                {% if item.shift_name_4 != None %}
                    {% if item.shift_name_4|stringformat:"s" == "Oui" or item.shift_name_4|stringformat:"s" == "Fermé" %}
                        {{ item.shift_name_4 }}
                    {% else %}
                        {% for shisetsu in shisetsu_object %}
                            {% if item.shisetsu_name_4|stringformat:"s" == shisetsu.name|stringformat:"s" %}                          
                                <span style="background-color:{{ shisetsu.color }}">{{ item.shift_name_4 }}</span>
                            {% endif %}
                        {% endfor %} 
                    {% endif %}    
                {% endif %}                   
            {% endif %}            
        {% endfor %}
        </td>

        <tr align="center">
            {% for month in month_total %} 
                {% if month.user ==  staff.id %}<!--Si le nom d'utilisateur est le même-->
                    <td><b>{{ month.month_total_worktime }}</b></td>
                {% endif %}
            {% endfor %}
            {% for item in object_list %} 
                {% if item.user|stringformat:"s" == staff.username|stringformat:"s" %}<!--Si le nom d'utilisateur est le même-->
                    <td class="day" id="s{{ staff.id }}d{{ item.date }}">
                        <a href="{% url 'schedule:update' item.pk %}">{{ item.day_total_worktime }} </a>
                    </td>
            {% endif %}            
        {% endfor %}
    </tr>
{% endfor %}
</tbody>
</table>
{% endblock content %}



Le html est long, mais je l'ai modifié en répétant le processus avec Saigo pour. En affichant l'heure avec la clé primaire dans itm.pk avec schedule: update avec la balise a, il est désormais possible de passer à l'écran d'édition de l'enregistrement cible.

image.png

Maintenant qu'il s'agit d'un lien, il s'affiche en bleu clair. Ensuite, j'ai également modifié update.html afin de pouvoir revenir lorsque j'appuie sur le bouton de retour sans mettre à jour depuis l'écran de mise à jour.

schedule/update.html


{% extends 'schedule/base.html' %}

{% block header %}
{% endblock header %}

{% block content %}
<form action="" method="POST">{% csrf_token %}
    <P >Nom de l'employé: {{ User_list.last_name }} {{ User_list.first_name }}</P>
    <p>Date: {{ Schedule_list.date }}</p>
    {{ form.as_p }}
    {% csrf_token %}
    <input class="btn btn-primary" type="submit" value="mise à jour">
    <a href="{% url 'schedule:monthschedule' Schedule_list.year Schedule_list.month %}" class="btn-secondary btn active">Revenir</a>
</form>
{% endblock content %}

Maintenant que les bases de l'édition sont terminées, j'aimerais implémenter une fonction pour créer le mois prochain, par exemple lorsqu'il y a encore peu d'informations lorsque les gens les voient, ou que le total est calculé à partir du symbole de décalage.

Pendant que je travaillais dessus, j'ai constaté que cela ne fonctionnait pas lors du passage de décembre à janvier. Pour faire face à cela, il semble que vous puissiez facilement calculer le mois en installant relativedelta, alors installez-le.

terminal


pip install python-dateutil

schedule.Viewspy


from django.shortcuts import render, redirect, HttpResponseRedirect
from shisetsu.models import *
from accounts.models import *
from .models import *
import calendar
import datetime
from datetime import timedelta
from datetime import datetime as dt
from django.db.models import Sum
from django.contrib.auth.models import User
from django.views.generic import FormView, UpdateView
from django.urls import reverse_lazy
from .forms import *
from dateutil.relativedelta import relativedelta
# Create your views here.

def homeschedule(request):
    from datetime import datetime
    now = datetime.now()
    return HttpResponseRedirect('/schedule/monthschedule/%s/%s/' % (now.year,now.month,))  #Rediriger automatiquement vers l'écran d'équipe de ce mois

def monthschedulefunc(request,year_num,month_num):
    user_list = User.objects.all()
    year, month = int(year_num), int(month_num)
    shisetsu_object = Shisetsu.objects.all()
    shift_object = Shift.objects.all()
    object_list = Schedule.objects.filter(year = year, month = month).order_by('user', 'date')
    month_total = Schedule.objects.select_related('User').filter(year = year, month = month).values("user").order_by("user").annotate(month_total_worktime = Sum("day_total_worktime"))
    #Obtenez le nombre de jours dans la plage de travail
    enddate = datetime.date(year,month,20)
    startdate = enddate + relativedelta(months=-1)
    kaisu = enddate - startdate
    kaisu = int(kaisu.days) 
    kikan = str(startdate) +"~"+ str(enddate)
    
    #Faites une liste de dates et de jours
    hiduke = str(startdate)
    date_format = "%Y-%m-%d"
    hiduke = dt.strptime(hiduke, date_format)
    weekdays = ["Mois","Feu","eau","bois","Argent","sol","journée"]
    calender_object = []
    youbi_object = []
    for i in range(kaisu):
        hiduke = hiduke + timedelta(days=1)    
        calender_object.append(hiduke)
        youbi = weekdays[hiduke.weekday()] 
        youbi_object.append(youbi)
    
    kaisu = str(kaisu)

    context = {
        'year': year,
        'month': month,
        'kikan': kikan,
        'object_list': object_list,
        'user_list': user_list,
        'shift_object': shift_object,
        'calender_object': calender_object,
        'youbi_object': youbi_object,
        'kaisu': kaisu,
        'shisetsu_object': shisetsu_object,
        'month_total' : month_total,
    }
    return render(request,'schedule/month.html', context)

def scheduleUpdatefunc(request,pk):
    Schedule_list = Schedule.objects.get(pk = int(pk))
    User_list = User.objects.get(username = Schedule_list.user)
    shift_object = Shift.objects.all()
    if request.method == 'POST':
        form = ScheduleUpdateForm(data=request.POST)
        year = Schedule_list.year
        month = Schedule_list.month
        if form.is_valid():
            Schedule_list.shift_name_1 = form.cleaned_data['shift_name_1']
            Schedule_list.shisetsu_name_1 = form.cleaned_data['shisetsu_name_1']
            Schedule_list.shift_name_2 = form.cleaned_data['shift_name_2']
            Schedule_list.shisetsu_name_2 = form.cleaned_data['shisetsu_name_2']
            Schedule_list.shift_name_3 = form.cleaned_data['shift_name_3']
            Schedule_list.shisetsu_name_3 = form.cleaned_data['shisetsu_name_3']
            Schedule_list.shift_name_4 = form.cleaned_data['shift_name_4']
            Schedule_list.shisetsu_name_4 = form.cleaned_data['shisetsu_name_4']
            Schedule_list.day_total_worktime = form.cleaned_data['day_total_worktime']
            Schedule_list.save()
            return HttpResponseRedirect('/schedule/monthschedule/%s/%s/' % (year,month,))

    else:
        item = {
            "shift_name_1":Schedule_list.shift_name_1,
            "shisetsu_name_1": Schedule_list.shisetsu_name_1,
            "shift_name_2": Schedule_list.shift_name_2,
            "shisetsu_name_2": Schedule_list.shisetsu_name_2,
            "shift_name_3": Schedule_list.shift_name_3,
            "shisetsu_name_3": Schedule_list.shisetsu_name_3,
            "shift_name_4": Schedule_list.shift_name_4,
            "shisetsu_name_4": Schedule_list.shisetsu_name_4,
            }
        form = ScheduleUpdateForm(initial=item)
        context = {
            'form' : form,
            'Schedule_list': Schedule_list,
            'User_list': User_list,
            'shift_object': shift_object,
        }

        return render(request,'schedule/update.html', context )


J'ai fait des choses supplémentaires, alors je l'ai corrigé un peu.

Recommended Posts

Transition vers l'écran de mise à jour avec le Django a tag
Créer un écran de connexion dans Django all auth
Créer un écran de mise à jour avec Django Updateview
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
L'histoire de l'échec de la mise à jour de "calendar.day_abbr" sur l'écran d'administration de django
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
Le moyen le plus simple de démarrer avec Django
Recréez l'écran d'inscription du personnel de Django avec la classe
Comment développer une application de panier avec Django
Une histoire sur l'implémentation d'un écran de connexion avec django
mettre à jour django version 1.11.1 vers 2.2
Notez la solution car django n'a pas pu s'installer avec pip
Comment créer un sous-menu avec le plug-in [Blender]
Essayez de créer une application Todo avec le framework Django REST
Créer une page d'accueil avec django
Comment mettre à jour avec SQLAlchemy?
Créer un écran de connexion Django
Trouver une solution au problème N-Queen avec un algorithme génétique (2)
Je veux créer un éditeur de blog avec l'administrateur de django
Probablement le moyen le plus simple de créer un pdf avec Python 3
La première étape de la création d'une application sans serveur avec Zappa
Comment générer une requête à l'aide de l'opérateur IN dans Django
Une histoire sur la façon de traiter le problème CORS
Je n'arrive pas à me connecter à la page d'administration avec Django 3
La façon habituelle d'ajouter un noyau avec Jupyter Notebook
DJango Memo: depuis le début (plus de modifications sur l'écran de gestion)
Trouver une solution au problème N-Queen avec un algorithme génétique (1)
[Python] Créer un écran pour le code d'état HTTP 403/404/500 avec Django
Comment enregistrer les mêmes données plusieurs fois avec une seule entrée sur l'écran de gestion de Django
[Apprentissage de Django avec la lame du diable] Comment obtenir un ensemble de requêtes pour une référence avant / arrière
Étapes pour développer Django avec VSCode
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Déployer l'application Django avec Docker
Standardiser le HTML à louer avec Django
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Les utilisateurs de Rails essaient de créer un moteur de blog simple avec Django
Django Tips-Créez un site de classement avec Django-
J'ai essayé de résumer brièvement la procédure de démarrage du développement de Django
Comment démarrer avec Django
Créer une application Web avec Django
Je voulais résoudre le problème ABC164 A ~ D avec Python
Écrivez un script pour calculer la distance avec le système Elasticsearch 5 sans douleur
Déployer le didacticiel Django sur IIS ①
Mettre à jour les applications exécutées sur Django 1.7 vers Django 1.8
J'ai comparé Jinja2 en lisant le document pour l'utiliser avec Django
Comment envoyer une requête à l'API DMM (FANZA) avec python
Créer un téléchargeur de fichiers avec Django
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
[EC2] Comment faire une capture d'écran de votre smartphone avec du sélénium
Un mémo pour utiliser simplement le capteur d'éclairement TSL2561 avec Raspberry Pi 2
[Django 2.2] Ajouter un nouveau badge aux nouveaux messages avec une date à l'aide d'un filtre de modèle
Réfléchissez à la façon d'écrire un filtre avec les versions Shotgun API-Contact
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
[Python] Explique comment utiliser la fonction range avec un exemple concret
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste