[PYTHON] Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schichterstellungsseite)

Ich werde die Hauptseite erstellen (Übrigens wurde die Innenseite meines Kopfes von hier aus durcheinander gebracht).

Übrigens sieht der Bildschirm momentan so aus.

出来上がった画面

URL-Einstellungen

Zunächst aus den URLconf-Einstellungen. Erstellen Sie dieses Mal eine URL wie ** http: // shift-maker / 2014/5/15 / shift / **, geben Sie die Jahres- und Monatszahlen ein und bringen Sie die Zahlen zur Ansichtsfunktion, um eine Verbindung zu den Daten herzustellen. Ich möchte, dass es sich so anfühlt.

url.py

#...
month_url = r'(?P<year_num>\d+)\-(?P<month_num>\d+)'  #Ich hatte das Gefühl, dass es wiederverwendet werden würde, also definierte ich es als Variable. Jahres- und Monatszahlen sind Jahr_num,month_Ansichten als num.Sie können es zum py nehmen.

urlpatterns += patterns('schedule.views',
    url(r'^$', 'home', name="Home"),  #Übrigens verstehe ich die Bedeutung dieses Namensattributs nicht (obwohl ich es vorerst festgelegt habe)
	url(r'^%s/shift/$' % (month_url,),'a_month_shift',name="MonthShift"),
)
#...

Ich habe die Homepage als Bonus festgelegt, ohne tief nachzudenken.

2. Ansichtsfunktion

Wenn Sie eine monatliche Schichtproduktionsseite erstellen möchten, müssen Sie den Inhalt des Monats (Datum, Tag usw.) abrufen, jedoch in Python einem praktischen Modul namens Kalender. Es gibt Artikel / e2d42c2f457e4b49b8b5), also benutze ich es. Dieses Mal wird es als [eine Funktion namens get_calendar im GroupSchedule-Modell von owner / models.py] geschrieben (http://qiita.com/juniskw/items/8edf5fb52a997b486614).

schedule/views.py

from django.contrib.auth.decorators import login_required
from django.shortcuts import render,redirect


@login_required
def home(req):
	from datetime import datetime
	
	now = datetime.now()

	return redirect( '/%s-%s/shift/' % (now.year,now.month,) )  #Automatisch zum Schichtbildschirm dieses Monats umleiten

@login_required
def a_month_shift(req,year_num,month_num):
	from owner.models import GroupSchedule
	from schedule.models import WorkTime,MonthShift,StaffSchedule,NgShift,GuestSchedule
	from datetime import date

	year,month = int(year_num),int(month_num)

	try:
		groupschedule = GroupSchedule.objects.get(owner=req.user)
	except GroupSchedule.DoesNotExist:  #Wenn Sie die Schicht nicht einstellen können
		return redirect('/owner/schedule/edit')  #Zum Einstellungsbildschirm

    monthshift,created = groupschedule.monthshift_set.get_or_create(year=year,month=month,groupschedule=req.user.groupschedule)  # get_or_create ist eine praktische Verknüpfung, bei der nicht jedes Mal eine try-Anweisung geschrieben werden muss. Beachten Sie, dass es zwei linke Seiten gibt (was die zweite ist, ist derzeit unbekannt)

	if req.method == 'POST':
		posted = req.POST
		s_year,s_month,s_day = int(posted['year']),int(posted['month']),int(posted['day'])  # s_Weil der Personalplan_Abkürzung für. Datumsinformationen aus POST-Daten erhalten ...
		s_date = date( year=s_year,month=s_month,day=s_day )  #Variable als Datumsobjekt

		try:  #Möchten Sie den Personalplan aus dem POST-Datum und den Mitarbeiterinformationen abrufen?
			s_schedule = StaffSchedule.objects.get( date=s_date,staff=int(posted['staff']) )
		except StaffSchedule.DoesNotExist:  #Erstellen Sie, wenn nicht
			from staff.models import Staff
			s_schedule = StaffSchedule(date=s_date)
			s_schedule.staff = Staff.objects.get( id=int(posted['staff']) )

		s_schedule.monthshift = monthshift

		s_schedule.worktime = WorkTime.objects.get( id=int(posted['shift']) )  #Bestätigen Sie die Arbeitszeit des Personalplans ...

		s_schedule.save()  #sparen

	month_cal = groupschedule.get_calendar(year,month)  #Werden Sie im GroupSchedule-Modell definiert_Holen Sie sich Monatsinformationen aus dem Kalender

	return render(req,'schedule/a_month_shift.html',{
		'year':year_num,  #Verwenden Sie es so wie es ist für Seitentitel usw.
		'month':month_num,  #Das gleiche wie oben
		'month_cal':month_cal,  #Kalenderinformationen
		'monthshift':monthshift,  #Ich habe es noch nicht benutzt
		'weekdays':['Mond','Feuer','Wasser','Holz','Geld','Boden','Tag',],  # 曜Tagの表示方法(デフォルトだとSundayとかになるので馴染みづらい)
		'staffs':groupschedule.staff_set.order_by('id'),
		'worktimes':groupschedule.worktime_set.order_by('id'),
	})

Vorlage

Schreiben Sie danach eine solche Vorlage. Zuerst habe ich eine Basis für die Anwendung erstellt (aber es ist subtil, wenn ich sie trennen muss).

templates/schedule/bases/base_a_month.html

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

{% block title %} {{ year_num }}-{{ month_num }} {% endblock %}

{% block main %}
<!--von hier-->
<a href="/logout">Log out</a>
<a href="/staff/new"><button class="btn btn-success">Add New Staff</button></a>
<!--Das Layout klappert, weil ich es bisher in den Text eingefügt habe-->

<ul class="pager">
	<li class="previous">
		{% ifnotequal month '1' %}
		<a href="/{{ year }}-{{ month|add:'-1' }}/shift">Im vergangenen Monat</a>
		{% else %}
		<a href="/{{ year|add:'-1' }}-12/shift">Im vergangenen Monat</a>
		{% endifnotequal %}
	</li>
	<li class="next">
		{% ifnotequal month '12' %}
		<a href="/{{ year }}-{{ month|add:"1" }}/shift">Nächsten Monat</a>
		{% else %}
		<a href="/{{ year|add:'1' }}-1/shift">Nächsten Monat</a>
		{% endifnotequal %}
	</li>
</ul>

<h1><small>{{ year }}-</small>{{ month }}</h1>	<!--Überschrift. Welches Jahr und welcher Monat?-->

<table class="table table-bordered {% block t_class %}{% endblock %}">

	{% block t_main %}
        <!--Stellen Sie den Hauptinhalt hier ein-->
	{% endblock %}

</table>
{% endblock main %}

Und das Folgende ist der Hauptinhalt.

templates/schedule/a_month_shift.html

{% extends "schedule/bases/base_a_month.html"  %}

{% block title %} Shift:{{ year }}/{{ month }}-{{ month|add:1 }} {% endblock %}

{% block t_main %}
<script type="text/javascript" src="{{ STATIC_URL }}js/a_month_shift.js"></script>
<link type="text/css" rel="stylesheet" href="{{ STATIC_URL }}css/a_month_shift.css">  <!--Ich habe es im Moment nicht geschafft-->
				
	{% load schedule_controler %}  {#Laden Sie Ihren eigenen Filter#}

<thead>
	<tr align="center" class="info">	<!--Datum-->
		<th rowspan="2"></th>
	{% for cal in month_cal %}  {#Kalender Tag für Tag anzeigen#}
		<th class="day_{{ cal.day }}">{{ cal.day }}</th>
	{% endfor %}

	{% for worktime in worktimes %}  {#Registrierte Arbeitszeiten einzeln anzeigen (Überschrift für Statistiken für jede Arbeitsstunde)#}
		<th rowspan="2">{{ worktime.title }}</th>
	{% endfor %}
	</tr>

	<tr class="info">	<!--Tag-->
	{% for cal in month_cal %}

		<th class="day_{{ cal.day }}">{{ weekdays|index_is:cal.weekday }}</th>  {# index_ist ein selbst hergestellter Filter#}

	{% endfor %}
	</tr>
</thead>
<tbody>
	{% for staff in staffs %}
	<tr align="center">
		<th class="info" staff_id="{{ staff.id }}">{{ staff }}</th>  <!--staff_ID-Element, das in js verwendet wird-->
		{% for cal in month_cal %}
		<td class="day_{{ cal.day }}" id="s{{ staff.id }}d{{ cal.day }}">
			{% include 'schedule/parts/dropdown.html' %}  {#Da der WorkTime-Auswahlteil in der Dropdown-Liste als Teil in einer separaten Datei erstellt wird, möchten Sie ihn hier lesen#}
		</td>
		{% endfor %}

		{% for worktime in worktimes %}
		<td>
			{% with staff.staffschedule_set|worktime_filter:worktime as worktime_set %}  {# worktime_Mit Filter ...#}
				{% with worktime_set|monthshift_filter:monthshift as month_worktime_set %}  {# monthshift_Ich habe auch meinen eigenen Filter gemacht#}
					{{ month_worktime_set.count }}  {#count ist eine integrierte Komfortmethode, die hier von WorkTime für Statistiken verwendet wird.#}
				{% endwith %}
			{% endwith %}
		</td>
		{% endfor %}
	</tr>

	{% endfor %}
</tbody>
{% endblock t_main %}

Ich verwende an einigen Stellen meinen eigenen Filter, aber dies kann aufgerufen werden, indem ein neues Verzeichnis mit dem Namen ** templatetags ** direkt unter dem Anwendungsverzeichnis erstellt und dort erstellt wird. Referenz: http://docs.djangoproject.jp/en/latest/howto/custom-template-tags.html

** schedine_controler.py **, ** a_month_shift.js **, ** dropdown.html ** usw., die diese selbst erstellten Filter geschrieben haben, sind wahrscheinlich lang, daher werde ich es beim nächsten Mal versuchen.

Recommended Posts

Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schichterstellungsseite)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Einführung)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schreiben Sie eine Basisvorlage)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Authentifizierungsverarbeitung)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Experiment auf der Admin-Seite)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Entwurf des Datenbankmodells)
Todo-App mit Django erstellen ③ Aufgabenlistenseite erstellen
Erstellen Sie eine einfache Web-App mit Flasche
Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Erstellen Sie eine Homepage mit Django
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erstellen Sie eine Webanwendung mit Django
Todo-App mit Django erstellen ⑤ Funktion zum Bearbeiten von Aufgaben erstellen
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
Erstellen Sie eine Webanwendung mit Django
Erstellen Sie mit Django einen Datei-Uploader
Spielen Sie wie eine Web-App mit ipywidgets
Erstellen Sie eine GUI-App mit Tkinter of Python
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Erstellen der ersten App mit Django Startprojekt
Erstellen Sie einen Webdienst mit Docker + Flask
Ich habe eine WEB-Bewerbung bei Django gemacht
"Klassifizierung von Müll nach Bild!" App-Erstellungstagebuch Tag3 ~ Webanwendung mit Django ~
Django Tutorial (Blog App erstellen) ① - Vorbereitung, Erstellung der obersten Seite
So entwickeln Sie eine Cart-App mit Django
Entwicklung einer WEB-Anwendung mit Django [Erstellung des Admin-Bildschirms]
Erstellen Sie eine PDF-Datei mit einer zufälligen Seitengröße
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Erstellen Sie mit der Doker Toolbox eine Django-Entwicklungsumgebung
Erstellen Sie eine neue Seite im Zusammenfluss mit Python
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Bis Sie eine neue App in Django erstellen
Extrahieren Sie mit Python Daten von einer Webseite
Versuchen Sie, eine Webanwendung mit Vue.js und Django (Mac Edition) zu erstellen - (1) Umgebungskonstruktion, Anwendungserstellung
Stellen Sie Python 3.6 / Django / Postgres-Webanwendungen in Azure bereit
Entwicklungsverdauung mit Django
Erstellen Sie einen Django-Zeitplan
Rückblick auf die Erstellung eines Webdienstes mit Django 1
Was ist ein Hund? Startvolumen der Django-App erstellen --startapp
Erstellen Sie mit Py2app und Tkinter eine native GUI-App
[Übung] Erstellen Sie eine Watson-App mit Python! # 1 [Sprachdiskriminierung]
Django Shift Creation Funktion
Erstellen Sie eine Python-Entwicklungsumgebung mit Vagrant + Ansible + Fabric
Rückblick auf die Erstellung eines Webdienstes mit Django 2
Was ist ein Hund? Django App Creation Start Volume - Startprojekt
Stellen Sie die mit PTVS erstellte Django-App in Azure bereit
Für mich als Django-Anfänger (1) -Erstellen eines Projekts / einer App-
Für mich als Django-Anfänger (4) - Erstellen Sie eine Memo-App-
Erstellen Sie eine Entwicklungsumgebung mit Poetry Django Docker Pycharm
Stellen Sie Echtzeit-Webanwendungen mit swampdragon x apache bereit
Erstellen Sie eine Django-Umgebung mit Docker-Compose (MariaDB + Nginx + uWSGI).
Stellen Sie eine mit Streamlit erstellte Web-App für Heroku bereit
So stellen Sie eine mit Flask erstellte Web-App für Heroku bereit
[Übung] Erstellen Sie eine Watson-App mit Python! # 3 [Klassifizierung der natürlichen Sprache]
Erstellen Sie eine Web-App, die Zahlen mit einem neuronalen Netzwerk erkennt