Django super Einführung von Python-Anfängern! Teil 4 Ich habe eine supereinfache Tagebuchanwendung erstellt (nur mit Funktionen erstellt, ohne klassenbasierte Allzweckansichten zu verwenden).

Über diesen Artikel

Dies ist die Ausgabeseite des Ergebnisses des Lernens über Django bei Udemy. Der vorherige Artikel ist hier .

Dieses Mal möchte ich mit Django eine supereinfache Tagebuchanwendung erstellen. Um das Verständnis der Funktionsweise von Django zu vertiefen, verwenden wir dieses Mal nicht die klassenbasierte Allzweckansicht, sondern erstellen sie nur mit Funktionen.

Ergebnisse

oberste Seite

Detailseite

Seite aktualisieren

Seite löschen

Vorbereitungen

Zunächst aus dem Umweltbau. Erstellen Sie ein Projekt namens Second und eine Django-App namens Diary. Der Projektname ist beliebig, es ist jedoch sicherer, wenn möglich nur alphanumerische Zeichen mit halber Breite zu verwenden. Wenn der Projektname Unterstriche oder Leerzeichen enthält, kann bei der unten beschriebenen Prozedur ein mysteriöser Fehler auftreten.

django-admin startproject Second
cd diary_project
py .\manage.py startapp diary

Registrieren Sie die Tagebuch-App in settings.py und stellen Sie die japanische Zeit ein

Second\Second\sattings.py


INSTALLED_APPS = [
    'diary',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

models.py Dieses Mal wird der Prozess zum Registrieren von Daten in der Datenbank von Django ausgeführt. Definieren Sie also, welche Art von Daten in der Datenbank in models.py abgelegt werden. Umgekehrt können Sie bei models.py sehen, welche Datenfelder in Djangos DB vorbereitet sind. Wenn Sie den Primärschlüssel in models.py nicht explizit festlegen, wird der Primärschlüssel mit dem Namen id automatisch festgelegt.

Second\Second\models.py


from django.db import models
from django.utils import timezone

class Day(models.Model):
    #Ich habe es hier nicht deklariert, aber der Primärschlüssel namens id wird automatisch registriert.
    title = models.CharField('Titel', max_length=200)
    text = models.TextField('Text')
    date = models.DateField('Datum', default=timezone.now)

Registrieren Sie es nach der Eingabe von models.py in der Datenbank mit manage.py. Wechseln Sie in den Ordner, in dem manage.py gespeichert ist, und registrieren Sie ihn mit dem folgenden Befehl.

py .\manage.py makemigrations
py .\manage.py migrate

Beim Ausführen von Makemigrationen wird möglicherweise ein Rekursionsfehler angezeigt. RecursionError: maximum recursion depth exceeded while calling a Python object

Eine der Fehlerursachen ist, dass der Projektname andere Zeichen als alphanumerische Zeichen halber Breite enthält. Dies kann passieren, wenn der Pfad Leerzeichen enthält. Bitte beachten Sie, dass der Pfad Leerzeichen enthalten kann, wenn Sie ihn in einem speziellen Ordner wie OneDirve speichern.

urls.py Stellen Sie in urls.py direkt unter dem Projekt ein, dass Sie direkt unter der App zu urls.py wechseln.

Second\Second\urls.py


from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('diary/', include('diary.urls')),
]

Geben Sie urls.py wie folgt direkt unter der App ein.

Second\diary\urls.py


from django.urls import path
from . import views

app_name = 'diary'

urlpatterns = [
    path('', views.index, name='index'), #Listenseite
    path('add/', views.add, name='add'), #Zusätzliche Seite
    path('update/<int:pk>/', views.update, name='update'), #Seite aktualisieren
    path('delete/<int:pk>', views.delete, name='delete'), #Seite löschen
    path('detail/<int:pk>', views.detail, name='detail'), #Detailseite
]

Registrieren Sie die URL in urls.py direkt unter der App. Dieses Mal werden wir 5 Seiten mit Listen erstellen, hinzufügen, aktualisieren, löschen und Details. <int: pk> bedeutet den jedem Artikel zugeordneten Primärschlüssel.

Ich habe geschrieben, dass der Primärschlüssel namens id automatisch registriert wird, wenn models.py erklärt wird. In Django ist es üblich, diese ID mit einer Variablen namens pk auszudrücken. Sie können es als "<int: id>" ausdrücken, aber sagen wir "<int: pk>".

Um beispielsweise auf die Detailseite zuzugreifen, auf der pk 1 ist, wäre dies "Tagebuch / Detail / 1 /". Es ist nicht erforderlich für Listenseiten und zusätzliche Seiten, die nicht an einen bestimmten Artikel gebunden sind.

forms.py Erstellen Sie vor dem Erstellen von views.py eine neue Datei mit dem Namen forms.py. Erstellen Sie eine Datei mit dem Namen forms.py im selben Ordner wie views.py (Second \ diary). Bitte machen Sie den Inhalt wie folgt.

Second\diary\forms.py


from django import forms
from .models import Day


class DayCreateForm(forms.ModelForm):

    class Meta:
        model = Day
        fields = '__all__'

Natürlich ist beim Erstellen oder Aktualisieren eines Artikels ein Eingabefeld in der HTML-Datei erforderlich. Um das Eingabefeld zu erstellen, muss in der HTML-Datei etwas namens Form konfiguriert werden.

Diese forms.py definiert, welche Art von Daten an dieses Formular übergeben werden. Lassen Sie uns dieses Mal alle Daten der in models.py definierten Day-Klasse übergeben. Wenn Sie alles übergeben möchten, setzen Sie fields = '__ all __'.

Der Klassenname DayCreateForm ist beliebig. Die darin enthaltene Klasse Meta ist eine feste Phrase. Lass es uns nicht ändern.

views.py Erstellen Sie eine Funktion zum Anzeigen von Listen, Hinzufügen, Aktualisieren, Löschen und Detaillieren von Seiten in views.py. Ursprünglich kann es leicht geschrieben werden, indem Djangos göttliche Funktion verwendet wird, die als klassenbasierte Allzweckansicht bezeichnet wird. Da es in diesem Artikel um das Schreiben mit einer Funktion geht, wage ich es, ihn mit einer Funktion zu schreiben.

Second\diary\views.py


from django.shortcuts import render, redirect, get_object_or_404
from .forms import DayCreateForm
from .models import Day

def index(request):
    """
Zeigen Sie eine Tagebuchliste an
    """
    context = {
        'day_list':Day.objects.all(),
    }
    return render(request, 'diary/day_index.html', context)


def add(request):
    """
Tagebuchartikel hinzugefügt
    """
    #Erstellen Sie ein Formular basierend auf dem übermittelten Inhalt. Wenn nicht POST, erstellen Sie ein leeres Formular.
    form = DayCreateForm(request.POST or None)

    # method==POST ist, wenn die Sendetaste gedrückt wird. bilden.is_gültig ist wahr, wenn es kein Problem mit dem Eingabeinhalt gibt.
    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect('diary:index')
    
    #Wenn beim normalen Zugriff oder bei den Eingabeinhalten ein Fehler auftritt, wiederholen Sie den Tag_form.HTML anzeigen
    context = {
        'form':form
    }
    return render(request, 'diary/day_form.html', context)


def update(request, pk):
    """
Tagebuchartikel geändert
    """
    #Get Day basierend auf URL pk (pk ist das gleiche wie id)
    day = get_object_or_404(Day, pk=pk)

    #Verknüpfen Sie den erworbenen Tag mit dem Formular
    form = DayCreateForm(request.POST or None, instance=day)

    # method=POST(Drücken Sie die Sendetaste), Und wenn es kein Problem mit dem Eingabeinhalt gibt, speichern Sie das Formular.
    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect('diary:index')
    
    #Zeigen Sie die erste Seite an, wenn ein Problem mit dem normalen Zugriff oder den Eingabeinhalten vorliegt
    context = {
        'form':form
    }
    return render(request, 'diary/day_form.html', context)


def delete(request, pk):
    """
Tagebuchartikel löschen
    """
    #Get Day basierend auf der PK der URL (pk ist dasselbe wie id)
    day = get_object_or_404(Day, pk=pk)

    # method=POST(Drücken Sie die Sendetaste)
    if request.method == 'POST':
        day.delete()
        return redirect('diary:index')
    
    #Normaler Zugang. Oder Zugriff bei Problemen.
    context = {
        'day':day
    }
    return render(request, 'diary/day_delete.html', context)


def detail(request, pk):
    """
Tagebuchdetailseite
    """
    #Tag abrufen basierend auf der PK der URL
    day = get_object_or_404(Day, pk=pk)

    context = {
        'day':day
    }
    return render(request, 'diary/day_detail.html', context)

def index (request): ist eine Funktion zum Anzeigen einer Artikelliste. Weisen Sie dem Kontext alle Daten der Day-Klasse in models.py zu. Ich übergebe den erstellten Kontext mit der Renderfunktion an day_index.html.

def add (request): ist eine Funktion zum Erstellen eines neuen Artikels. Erstellen Sie ein Formular basierend auf dem übermittelten Inhalt mit form = DayCreateForm (request.POST oder None). Wenn es sich vor der Übermittlung im Status befindet, ist es ein leeres Formular. if request.method == 'POST' und form.is_valid (): ist der Vorgang, bei dem die Senden-Schaltfläche gedrückt wird und es kein Problem mit dem Inhalt gibt. Da es kein Problem gibt, speichern Sie es mit form.save () und leiten Sie zur Seite index.html weiter. Übergeben Sie bei normalem Zugriff oder bei einem Fehler in der Eingabe den Kontext mit der Renderfunktion an day_form.html.

def update (request, pk): ist eine Funktion zum Ändern des Inhalts des Artikels. Beim Anzeigen dieser Update-Seite lautet die URL Tagebuch / Update / . Wir müssen den Primärschlüssel des Artikels aktualisieren, also übergeben Sie pk als Argument. Verknüpfen Sie das von der URL empfangene Paket mit der Tagesklasse und erhalten Sie den Inhalt des Artikels mit dem folgenden Code. day = get_object_or_404(Day, pk=pk) Die nachfolgende Verarbeitung entspricht dem Ablauf der Add-Funktion.

def delete (request, pk): ist eine Funktion zum Löschen eines Artikels. Es ist fast der gleiche Vorgang wie beim Aktualisieren, aber da es gelöscht wird, muss das Formular nicht ausgeführt werden, sodass es nicht erstellt wird. Löschen Sie den Artikel mit day.delete () und leiten Sie ihn zu index.html weiter.

def detail (request, pk): ist eine Funktion zum Anzeigen der Detailseite des Artikels. Es ist einfach, weil Sie auch kein Formular erstellen müssen.

Erstellen einer HTML-Datei

Erstellen Sie schließlich eine HTML-Datei. Erstellen Sie einen Vorlagenordner unter dem Tagebuchordner und erstellen Sie dann einen Tagebuchordner.

Base.html erstellen

Erstellen Sie zunächst base.html. Dies ist die HTML-Datei, die das Meisterwerk von allem ist.

Verknüpfen Sie die Listenseite und die Erstellung neuer Artikel im Navi-Teil. Verknüpfung mit {% url '<Anwendungsname>: <in urls.py definierter Namenswert>'%}.

Second\diary\templates\diary\base.html


<!doctype html>
<html lang="ja">
  <head>
    <title>Tagebuchanwendung</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
  </head>
  <body>

    <div class="container">
      <nav class="nav">
        <a class="nav-link active" href="{% url 'diary:index' %}">Aufführen</a>
        <a class="nav-link" href="{% url 'diary:add' %}">hinzufügen</a>
      </nav>
      {% block content %}
      {% endblock %}
    </div>

    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
  </body>
</html>

Day_index.html erstellen

Es ist eine Listenseite mit Artikeln.

Von views.py wird day_list also der Schlüsselkontext übergeben Mit day_list können Sie auf die in Ihrer Datenbank gespeicherten Artikeltitel und -daten zugreifen. Dies wird mit der for-Anweisung angezeigt.

Es ist ein Mechanismus, um auf die Aktualisierungsseite jedes Artikels zuzugreifen, indem day.pk zum Aktualisieren und Löschen übergeben wird.

Second\diary\templates\diary\day_index.html


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

{% block content %}

<h1>Tagebuchliste</h1>

<table class="table">
    <thead>
        <tr>
            <th>Titel</th>
            <th>Datum</th>
            <th>Aktualisierungsprozess</th>
            <th>Prozess löschen</th>
        </tr>
    </thead>
    <tbody>
    {% for day in day_list %}
        <tr>
            <td><a href="{% url 'diary:detail' day.pk %}">{{ day.title }}</a></td>
            <td>{{ day.date }}</td>
            <td><a href="{% url 'diary:update' day.pk %}">aktualisieren</a></td>
            <td><a href="{% url 'diary:delete' day.pk %}">Löschen</a></td>
        </tr>
    {% endfor %}
    </tbody>
</table>

{% endblock %}

Day_detail.html erstellen

Dies ist die Detailseite. Titel, Text und Datum werden angezeigt. Nach dem Text wird der Zeilenumbruch hinzugefügt Dies dient zum Ausdrücken von Zeilenumbrüchen in HTML. Auch ohne gibt es kein Problem.

Second\diary\templates\diary\day_detail.html.html


{% extends 'diary/base.html' %}
{% block content %}
    <table class="table">
        <tr>
            <th>Titel</th>
            <td>{{ day.title }}</td>
        </tr>
        <tr>
            <th>Text</th>
            <td>{{ day.text | linebreaksbr}}</td>
        </tr>
        <tr>
            <th>Datum</th>
            <td>{{ day.date }}</td>
        </tr>
    </table>
    <a href="{% url 'diary:update' day.pk %}"><button class="btn btn-primary">aktualisieren</button></a>
    <a href="{% url 'diary:delete' day.pk %}"><button class="btn btn-danger">Löschen</button></a>    
    
{% endblock %}

Day_form.html erstellen

Ein Formular erstellen. Es wird zum Erstellen und Aktualisieren von Artikeln verwendet.

Second\diary\templates\diary\day_form.html


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

{% block content %}
<form action="" method="POST">
    <table class="tabel">
        <tr>
            <th>Titel</th>
            <td>{{ form.title }}</td>
        </tr>
        <tr>
            <th>Text</th>
            <td>{{ form.text }}</td>
        </tr>
        <tr>
            <th>Datum</th>
            <td>{{ form.date }}</td>
        </tr>
    </table>

    <button type="submit" class="btn btn-primary">Senden</button>
    {% csrf_token %}
</form>
{% endblock %}

Day_delete.html erstellen

Ähnliche Inhalte werden fortgesetzt, aber dies ist das Ende. Die letzte ist die Löschseite.

Second\diary\templates\diary\day_delete.html


{% extends 'diary/base.html' %}
{% block content %}
<form action="" method="POST">
    <table class="table">
        <tr>
            <th>Titel</th>
            <td>{{ day.title }}</td>
        </tr>
        <tr>
            <th>Text</th>
            <td>{{ day.text }}</td>
        </tr>
        <tr>
            <th>Datum</th>
            <td>{{ day.date }}</td>
        </tr>
    </table>
    <p>Löschen Sie diese Daten.</p>
    <button type="submit" class="btn btn-primary">Löschen</button>
    {% csrf_token %}
</form>
{% endblock %}

Funktionsprüfung

Lassen Sie uns danach den Vorgang mit dem Ausführungsserver py manage.py überprüfen. Wenn Sie einen Artikel erstellen / aktualisieren / löschen können, sind Sie erfolgreich.

Recommended Posts

Django super Einführung von Python-Anfängern! Teil 4 Ich habe eine supereinfache Tagebuchanwendung erstellt (nur mit Funktionen erstellt, ohne klassenbasierte Allzweckansichten zu verwenden).
Django super Einführung von Python-Anfängern! Teil 5 Ich habe eine supereinfache Tagebuchanwendung mit einer klassenbasierten Allzweckansicht erstellt
Django super Einführung von Python-Anfängern! Teil 2 Ich habe versucht, die praktischen Funktionen der Vorlage zu nutzen
Django super Einführung von Python-Anfängern! Teil 3 Ich habe versucht, die Vererbungsfunktion für Vorlagendateien zu verwenden
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
Django super Einführung von Python-Anfängern! Teil 1 Ich habe versucht, eine HTML-Seite anzuzeigen, auf der nur "Hallo Welt" steht.
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe eine GUI-App mit Python + PyQt5 erstellt
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Ich habe ein Paket erstellt, um Zeitreihen mit Python zu filtern
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (5) [Einführung in den DB-Betrieb mit Django-Shell]
Ich habe eine Bibliothek erstellt, die Konfigurationsdateien mit Python einfach lesen kann
[Python] Ein Memo zum Betreiben eines mit GBDK mit PyBoy erstellten ROM
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe einen Pokerspielserver Chat-Holdem mit Websocket mit Python erstellt
Ich habe einen Line-Bot mit Python gemacht!
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
[Einführung in die Udemy Python3 + -Anwendung] 47. Verarbeiten Sie das Wörterbuch mit einer for-Anweisung
Ich habe eine Webanwendung in Python erstellt, die Markdown in HTML konvertiert
[Django] Erstellt ein Feld zur Eingabe von Daten mit 4-stelligen Zahlen
Python-Anfänger veröffentlichen Web-Apps mit maschinellem Lernen [Teil 2] Einführung in explosives Python !!
[Streamlit] Ich hasse JavaScript, deshalb erstelle ich eine Webanwendung nur mit Python
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Implementieren Sie eine einfache Anwendung mit Python Full Scratch ohne Verwendung eines Webframeworks.
Webanwendung mit Flasche (1)
Django Todo Listenerstellung
ToDo-Listenerstellung [Python Django]
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Einführung in die KI-Erstellung mit Python! Teil 3 Ich habe versucht, Bilder mit einem Convolutional Neural Network (CNN) zu klassifizieren und vorherzusagen.
Einführung in die KI-Erstellung mit Python! Teil 2 Ich habe versucht, den Hauspreis in Boston mit einem neuronalen Netz vorherzusagen