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.
oberste Seite
Detailseite
Seite aktualisieren
Seite löschen
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 / 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 Sie schließlich eine HTML-Datei. Erstellen Sie einen Vorlagenordner unter dem Tagebuchordner und erstellen Sie dann einen Tagebuchordner.
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>
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 %}
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 %}
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 %}
Ä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 %}
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