[PYTHON] Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren

Als Nächstes implementieren wir die Funktionen zum Erstellen von Ordnern und Aufgaben.

Liste der Artikel

Erstellen einer Todo-App mit Django ① Erstellen einer Umgebung mit Docker Todo-App mit Django erstellen ② Seite mit Ordnerliste erstellen Todo-App mit Django erstellen ③ Seite mit Aufgabenliste erstellen Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren Erstellen einer Todo-App mit Django ⑤ Erstellen einer Aufgabenbearbeitungsfunktion

Implementierung der Ordnererstellungsfunktion

URL-Einstellungen

Stellen Sie zunächst die URL basierend auf der folgenden Definition ein.

URL wird bearbeitet
/folders/create Einen neuen Ordner erstellen

Um dieses Design zu erhalten, fügen Sie den folgenden Satz zu "todo / urls.py" hinzu.

todo/urls.py


path('create', views.create_folder, name='folders.create')

Formularerstellung

Erstellen Sie zunächst eine Datei mit dem Namen forms.py im Verzeichnis todo. Diese Datei ist die Datei, die Sie zum Erstellen des Formulars benötigen.

Bearbeiten Sie forms.py wie folgt.

forms.py


from django import forms
from .models import Folder

class FolderForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(FolderForm, self).__init__(*args, **kwargs)
        for field in self.fields.values():
            field.widget.attrs = {
                'class': 'form-control'
            }
    class Meta:
        model = Folder
        fields = ('title',)
        labels = {'title' : 'Ordnernamen'}

Die zum Erstellen eines Formulars erforderlichen Modelle "Formulare" und "Ordner" werden in die Zeilen 1 und 2 importiert. Im Teil \ _ \ _ init \ _ \ _ ist der Klassenname von FolderForm formulargesteuert. Dies dient zum Anwenden von Bootstrap.

django hat eine Klasse namens django.forms.ModelForm, die automatisch ein Feld basierend auf der Model-Klasse generiert. Es erscheint zweckmäßig, die ModelForm-Klasse für die Registrierung und Aktualisierungsverarbeitung zu verwenden.

Die Bedeutungen der Meta-Klassenvariablen sind wie folgt.

Variablennamen Bedeutung
model Geben Sie die zu verknüpfende Modellklasse an
fields Geben Sie das Zielfeld an, um das Eingabeformular aus Model im Tapple-Format zu generieren
labels Ändern Sie den Anzeigenamen des Eingabefelds. (Wenn diesmal nicht angegeben, lautet der Anzeigename beispielsweise "title".)

Link zur Ordnererstellungsseite

Fügen Sie den Link wie folgt zu dem Teil von templates / index.html hinzu, in dem der Ordner hinzugefügt wird.

index.html


<a href="{% url 'folders.create' %}" class="btn btn-default btn-block">

Vorlage

Erstellen Sie "create_folders.html" im Verzeichnis "templates". Bearbeiten Sie create_folders.html wie folgt.

templates/create_folders.html


{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Todo</title>
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootflat/2.0.4/css/bootflat.min.css">
  <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
  <header>
    <nav class="my-navbar">
      <a class="my-navbar-brand" href="/">Todo</a>
    </nav>
  </header>
  <main>
    <div class="container">
        <div class="row">
          <div class="col col-md-offset-3 col-md-6">
            <nav class="panel panel-default">
              <div class="panel-heading">Fügen Sie einen Ordner hinzu</div>
              <div class="panel-body">
                <form method="POST">
                  {% csrf_token %}
                  {{ form.as_p }}
                  <div class="text-right">
                      <button type="submit" class="btn btn-primary">Senden</button>
                  </div>
                </form>
              </div>
            </nav>
          </div>
        </div>
      </div>
  </main>
</body>
</html>

CSRF-Maßnahmen werden in den folgenden Teilen ergriffen.

templates/create_folders.html


{% csrf_token %}

Darüber hinaus wird das Formular zum Erstellen eines Ordners im folgenden Teil erweitert.

create_folders.html


{{ form.as_p }}

Was ist "as_p"?

<p>
Inhalt der Form
</p>

Es bedeutet, dass es in Form von entwickelt wird.

Als nächstes werde ich eine Ansicht schreiben.

View Fügen Sie der Ansicht die folgende Methode "create_folder" hinzu.

views.py


from django.shortcuts import render, get_object_or_404, redirect#Weiterleitungsfunktion hinzugefügt
from .forms import FolderForm


def create_folder(request):
    if request.method == "POST":
        form = FolderForm(request.POST)
        if form.is_valid():
            folder = form.save(commit=False)
            folder.created_at = timezone.now()
            folder.save()
            return redirect('tasks.index', id=folder.id)
    else:
        form = FolderForm()
    return render(request, 'create_folders.html', {'form': form})

Zunächst importieren wir die von uns erstellten FolderForm- und Redirect-Funktionen.

Danach wird die Funktion create_folder definiert. Wenn Daten zu request.POST hinzugefügt werden, wird die Verarbeitung der if-Anweisung so geschrieben, dass der im Formular eingegebene Inhalt in der Datenbank gespeichert wird.

Bestätigung

Die Ordnererstellungsfunktion ist jetzt implementiert! Versuchen Sie es mit http: // localhost: 8000 / folders / create. Wenn es wie folgt aussieht, ist es in Ordnung! フォルダー作成機能.png

Implementierung der Aufgabenerstellungsfunktion

URL-Einstellungen

Stellen Sie zunächst die URL basierend auf der folgenden Definition ein.

URL wird bearbeitet
<int:id>/tasks/create Erstellen Sie eine neue Aufgabe

Um dieses Design zu erhalten, fügen Sie den folgenden Satz zu "todo / urls.py" hinzu.

todo/urls.py


path('<int:id>/tasks/create', views.create_task, name='tasks.create')

Formularerstellung

Erstellen Sie ein Formular zum Erstellen einer Aufgabe in forms.py. Fügen Sie die folgende TaskForm-Klasse hinzu

todo/forms.py


from .models import Folder, Task#Aufgabenmodell importieren

class TaskForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(TaskForm, self).__init__(*args, **kwargs)
        for field in self.fields.values():
            field.widget.attrs = {
                'class': 'form-control'
            }
    class Meta:
        STATUS_CHOICES = [(1, 'Unvollständig'),(2, 'Arbeiten'),(3, 'Erledigt')]
        model = Task
        fields = ('title', 'status','due_date')
        labels = {
            'title': 'Aufgabennname',
            'status': 'Status',
            'due_date': 'Frist',
        }

Zunächst importieren wir das Task-Modell. Und wir fügen die TaskForm-Klasse hinzu.

Link zur Ordnererstellungsseite

Fügen Sie den Link wie folgt zum Teil "Aufgabe hinzufügen" von "templates / index.html" hinzu.

index.html


<a href="{% url 'tasks.create' id=current_folder
_id %}" class="btn btn-default btn-block">

Vorlage

Erstellen Sie "create_tasks.html" im Verzeichnis "templates". Bearbeiten Sie create_tasks.html wie folgt.

templates/create_tasks.html


{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Todo</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
  <link rel="stylesheet" href="https://npmcdn.com/flatpickr/dist/themes/material_blue.css">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootflat/2.0.4/css/bootflat.min.css">
  <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
<header>
  <nav class="my-navbar">
    <a class="my-navbar-brand" href="/">Todo</a>
  </nav>
</header>
<main>
    <div class="container">
        <div class="row">
          <div class="col col-md-offset-3 col-md-6">
            <nav class="panel panel-default">
              <div class="panel-heading">Fügen Sie eine Aufgabe hinzu</div>
              <div class="panel-body">
                <form method="POST">
                  {% csrf_token %}
                  {{ form.as_p }}
                  <div class="text-right">
                    <button type="submit" class="btn btn-primary">Senden</button>
                  </div>
                </form>
              </div>
            </nav>
          </div>
        </div>
      </div>
</main>

<script src="https://npmcdn.com/flatpickr/dist/flatpickr.min.js"></script>
<script src="https://npmcdn.com/flatpickr/dist/l10n/ja.js"></script>
<script>
  flatpickr(document.getElementsByName('due_date'), {
    locale: 'ja',
    minDate: new Date()
  });
</script>
</body>
</html>

Als nächstes werde ich eine Ansicht schreiben.

View Fügen Sie der Ansicht die folgende Methode "create_task" hinzu.

views.py


from .forms import FolderForm, TaskForm#TaskForm importieren

def create_task(request, id):
    #Holen Sie sich den ausgewählten Ordner
    current_folder = get_object_or_404(Folder, id=id)
    if request.method == "POST":
        form = TaskForm(request.POST)
        if form.is_valid():
            task = form.save(commit=False)
            task.created_at = timezone.now()
            task.folder_id = current_folder
            task.save()
            return redirect('tasks.index', id=current_folder.id)
    else:
        form = TaskForm()
    return render(request, 'create_tasks.html', {'form': form}, {'id':current_folder.id})

Die folgenden Teile sollten beachtet werden.

task.folder_id = current_folder

folder_id ist ein externer Schlüssel, aber Sie müssen beim Festlegen des externen Schlüssels ein Objekt übergeben (in diesem Fall Ordnerobjekt).

Vorlagenerweiterung

Vorlagen sind nützlich, wenn Sie dieselben Informationen und Layouts an mehreren Stellen verwenden möchten. Es ist nicht erforderlich, in jeder Datei zu wiederholen.

Um die ursprüngliche Vorlage zu erstellen, erstellen Sie eine Datei "base.html" im Verzeichnis "todo / templates".

templates
├── base.html
├── create_folders.html
├── create_tasks.html
└── index.html

Bearbeiten Sie base.html wie folgt.

base.html


{% load static %}
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Todo</title>
  {% block styles %}
  {% endblock %}
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootflat/2.0.4/css/bootflat.min.css">
  <link rel="stylesheet" href="{% static 'css/style.css' %}">
</head>
<body>
<header>
  <nav class="my-navbar">
    <a class="my-navbar-brand" href="{% url 'tasks.index' id=1 %}">Todo</a>
  </nav>
</header>
<main>
    {% block content %}
    {% endblock %}
</main>
{% block scripts %}
{% endblock %}
</body>
</html>

Im folgenden Teil wird HTML eingefügt.

  {% block styles %}
  {% endblock %}

Sie können base.html erweitern, indem Sie am Anfang der Datei Folgendes schreiben.

{% extends 'base.html' %}

Bearbeiten Sie auf dieser Grundlage "create_folders.html", "create_tasks" und "index.html" wie folgt.

create_folders.html


{% extends 'base.html' %}

{% block content %}
  <div class="container">
    <div class="row">
      <div class="col col-md-offset-3 col-md-6">
        <nav class="panel panel-default">
          <div class="panel-heading">Fügen Sie einen Ordner hinzu</div>
          <div class="panel-body">
            <form method="POST">
              {% csrf_token %}
              {{ form.as_p }}
              <div class="text-right">
                  <button type="submit" class="btn btn-primary">Senden</button>
              </div>
            </form>
          </div>
        </nav>
      </div>
    </div>
  </div>
{% endblock %}

create_tasks.html


{% extends 'base.html' %}

{% block styles %}
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
  <link rel="stylesheet" href="https://npmcdn.com/flatpickr/dist/themes/material_blue.css">
{% endblock %}

{% block content %}
  <div class="container">
    <div class="row">
      <div class="col col-md-offset-3 col-md-6">
        <nav class="panel panel-default">
          <div class="panel-heading">Fügen Sie eine Aufgabe hinzu</div>
          <div class="panel-body">
            <form method="POST">
              {% csrf_token %}
              {{ form.as_p }}
              <div class="text-right">
                <button type="submit" class="btn btn-primary">Senden</button>
              </div>
            </form>
          </div>
        </nav>
      </div>
    </div>
  <div>
{% endblock %}

{% block scripts %}
  <script src="https://npmcdn.com/flatpickr/dist/flatpickr.min.js"></script>
  <script src="https://npmcdn.com/flatpickr/dist/l10n/ja.js"></script>
  <script>
    flatpickr(document.getElementsByName('due_date'), {
      locale: 'ja',
      minDate: new Date()
    });
  </script>
{% endblock %}


index.html


{% extends 'base.html' %}

{% block content %}
  <div class="container">
    <div class="row">
      <div class="col col-md-4">
        <nav class="panel panel-default">
          <div class="panel-heading">Ordner</div>
          <div class="list-group">
            {% for folder in folders %}
            <a 
            href="{% url 'tasks.index' id=folder.id %}",
            class="list-group-item {% if current_folder_id == folder.id %}active{% endif %}"
           >
              {{ folder.title }}
            </a>
            {% endfor %}
          </div>
          <div class="panel-body">
            <a href="{% url 'folders.create' %}" class="btn btn-default btn-block">
Fügen Sie einen Ordner hinzu
            </a>
          </div>
        </nav>
      </div>
      <div class="column col-md-8">
        <div class="panel panel-default">
          <div class="panel-heading">Aufgabe</div>
          <table class="table">
            <thead>
            <tr>
              <th>Titel</th>
              <th>Status</th>
              <th>Frist</th>
              <th></th>
            </tr>
            </thead>
            <tbody>
              {% for task in tasks %}
                <tr>
                  <td>{{ task.title }}</td>
                  <td>
                    <span 
                    class="label {% if task.status == 1 %}label-danger{% endif %}{% if task.status == 2 %}label-info{% endif %}"
                    >
                    {{ task.get_status_display }}
                    </span>
                  </td>
                  <td>{{ task.due_date }}</td>
                  <td><a href="{% url 'tasks.edit' id=current_folder_id task_id=task.id %}">Bearbeiten</a></td>
                </tr>
              {% endfor %}
            </tbody>
          </table>
          <div class="panel-body">
            <div class="text-right">
              <a href="{% url 'tasks.create' id=current_folder_id  %}" class="btn btn-default btn-block">
Fügen Sie eine Aufgabe hinzu
              </a>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
{% endblock %}

abschließend

Dies ist das Ende dieses Kapitels! Der bisherige Code befindet sich im [Kapitel 4-Zweig] des Repositorys (https://github.com/takusugar0/django_todo/tree/chapter4). Im nächsten Kapitel werden wir die Aufgabenbearbeitungsfunktion implementieren!

Liste der Artikel

Erstellen einer Todo-App mit Django ① Erstellen einer Umgebung mit Docker Todo-App mit Django erstellen ② Seite mit Ordnerliste erstellen Todo-App mit Django erstellen ③ Seite mit Aufgabenliste erstellen Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren Erstellen einer Todo-App mit Django ⑤ Erstellen einer Aufgabenbearbeitungsfunktion

Recommended Posts

Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren
Todo-App mit Django erstellen ③ Aufgabenlistenseite erstellen
Todo-App mit Django erstellen ⑤ Funktion zum Bearbeiten von Aufgaben erstellen
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schichterstellungsseite)
Erstellen Sie mit Py2app und Tkinter eine native GUI-App
Erstellen Sie eine Homepage mit Django
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)
Implementieren Sie die Django-App auf Hy
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Entwurf des Datenbankmodells)
Erstellen Sie mit Django einen Datei-Uploader
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
Erstellen und Bereitstellen von Django-Apps (PTVS) mithilfe des Azure Table-Speichers
Erstellen Sie mit Python + Django + AWS eine Scraping-App und wechseln Sie Jobs
Erstellen Sie eine GUI-App mit Tkinter of Python
Erstellen Sie eine einfache Web-App mit Flasche
Erstellen der ersten App mit Django Startprojekt
Implementieren Sie ein Modell mit Status und Verhalten
Ramen-Kartenerstellung mit Scrapy und Django
Erstellen Sie einen Stapel mit einer Warteschlange und eine Warteschlange mit einem Stapel (von LetCode / Implement Stack using Queues, Implement Queue using Stacks)
So entwickeln Sie eine Cart-App mit Django
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Lassen Sie uns mit Vue.js und Django-Rest-Framework [Teil 1] ~ Django-Setup ~ eine nervenschwächende App erstellen
Einfache Aufgabenliste, erstellt mit Python + Django
Bis Sie eine neue App in Django erstellen
Versuchen Sie, eine Webanwendung mit Vue.js und Django (Mac Edition) zu erstellen - (1) Umgebungskonstruktion, Anwendungserstellung
[Go language] Erstellen Sie eine TUI-App mit Elm Architecture. Erstellen Sie eine leicht reichhaltige ToDo-App mit bubbletea
Was ist ein Hund? Startvolumen der Django-App erstellen --startapp
Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf
Was ist ein Hund? Django App Creation Start Volume - Startprojekt
Lassen Sie uns eine Mac-App mit Tkinter und py2app erstellen
Erstellen Sie mit PyQt5 und PyQtGraph einen 3D-Modell-Viewer
Stellen Sie die mit PTVS erstellte Django-App in Azure bereit
Für mich als Django-Anfänger (4) - Erstellen Sie eine Memo-App-
Erstellen Sie eine Django-Umgebung mit Docker-Compose (MariaDB + Nginx + uWSGI).
[Linux] Erstellen Sie ein Selbstzertifikat mit Docker und Apache
Django Todo Listenerstellung
Wenn ich eine Django-App auf Apache2 bereitstelle und keine statischen Dateien mehr liest
Schritte zum Einrichten von Pipenv, Erstellen einer CRUD-App mit Flask und Containerisieren mit Docker
Erstellen Sie eine Shogi Score Management App mit Django 4 ~ Create View ~
[Python] Erstellen Sie mit tkinter einen Bildschirm zur Datei- und Ordnerpfadspezifikation
Django-Tutorial (Blog-App erstellen) Ar - Artikeldetails / Funktionen bearbeiten / löschen
Erstellen Sie eine WEB-Überwachungskamera mit Raspberry Pi und OpenCV
Erstellen Sie eine App für maschinelles Lernen mit ABEJA Platform + LINE Bot
Erstellen Sie Anwendungen, registrieren Sie Daten und teilen Sie sie mit einer einzigen E-Mail
Lassen Sie uns ein PRML-Diagramm mit Python, Numpy und matplotlib erstellen.
Erstellen Sie mit Django eine Bulletin-Board-App von Grund auf neu. (Teil 2)
Erstellen Sie mit Django eine Bulletin-Board-App von Grund auf neu. (Teil 3)
Erstellen Sie eine Authentifizierungsfunktion mit django-allauth und CustomUser in Django
Erstellen Sie ein Bereitstellungsskript mit Stoff und Küche und verwenden Sie es erneut
Erstellen Sie mit Django eine API für die soziale Integration von Smartphone-Apps
[Python] Erstellen Sie mit Django einen Bildschirm für den HTTP-Statuscode 403/404/500
Todo App mit Django-Bootstrap-Modal-Forms-Plugin
Erstellen Sie eine API mit Django
ToDo-Listenerstellung [Python Django]
Erstellen Sie eine Webanwendung mit Django