Django super introduction par les débutants Python! Partie 4 J'ai créé une application de journal super simple (créée uniquement avec des fonctions sans utiliser de vues à usage général basées sur les classes)

À propos de cet article

Voici la page de sortie du résultat de l'apprentissage de Django chez Udemy. L'article précédent est ici .

Cette fois, j'aimerais créer une application de journal super simple avec Django. De plus, cette fois, afin d'approfondir la compréhension du fonctionnement de Django, nous n'utiliserons pas la vue générale basée sur les classes, mais la créerons uniquement avec des fonctions.

Livrables

haut de page

Page de détails

Mettre à jour la page

Supprimer la page

Préparation préalable

Tout d'abord, de la construction de l'environnement. Créez un projet appelé Second et une application Django appelée journal. Le nom du projet est arbitraire, mais il est prudent d'utiliser uniquement des caractères alphanumériques demi-largeur si possible. S'il y a des traits de soulignement ou des espaces vides dans le nom du projet, une erreur mystérieuse peut se produire dans la procédure décrite ci-dessous.

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

Enregistrez l'application Agenda dans settings.py et réglez l'heure japonaise

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 Cette fois, le processus d'enregistrement des données dans la base de données de Django se produira, alors définissez le type de données qui sera placé dans la base de données dans models.py. Inversement, si vous regardez models.py, vous pouvez voir quels champs de données sont préparés dans la base de données de Django. De plus, si vous ne définissez pas explicitement la clé primaire dans models.py, la clé primaire appelée id sera définie automatiquement.

Second\Second\models.py


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

class Day(models.Model):
    #Je ne l'ai pas déclaré ici, mais la clé primaire appelée id est automatiquement enregistrée.
    title = models.CharField('Titre', max_length=200)
    text = models.TextField('Texte')
    date = models.DateField('Date', default=timezone.now)

Après avoir entré models.py, enregistrez-le dans la base de données avec manage.py. Accédez au dossier où manage.py est enregistré et enregistrez-le avec la commande suivante.

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

Lors de l'exécution de makemigrations, vous pouvez voir une erreur de récursivité. RecursionError: maximum recursion depth exceeded while calling a Python object

L'une des causes de l'erreur est que le nom du projet contient des caractères autres que des caractères alphanumériques demi-largeur. Cela peut se produire si le chemin contient des espaces vides. Veuillez noter que le chemin peut contenir des espaces vides si vous l'enregistrez dans un dossier spécial tel que OneDirve.

urls.py Dans urls.py directement sous le projet, définissez pour accéder à urls.py directement sous l'application.

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')),
]

Entrez urls.py directement sous l'application comme suit.

Second\diary\urls.py


from django.urls import path
from . import views

app_name = 'diary'

urlpatterns = [
    path('', views.index, name='index'), #Page de liste
    path('add/', views.add, name='add'), #Page supplémentaire
    path('update/<int:pk>/', views.update, name='update'), #Mettre à jour la page
    path('delete/<int:pk>', views.delete, name='delete'), #Supprimer la page
    path('detail/<int:pk>', views.detail, name='detail'), #Page de détails
]

Enregistrez l'URL dans urls.py directement sous l'application. Cette fois, nous allons créer 5 pages de liste, ajouter, mettre à jour, supprimer et détails. `` <int: pk> '' signifie la clé primaire associée à chaque article.

J'ai écrit que la clé primaire appelée id est automatiquement enregistrée lors de l'explication de models.py, Dans Django, il est habituel d'exprimer cet identifiant avec une variable appelée pk. Vous pouvez l'exprimer comme <int: id> '', mais disons <int: pk> ''.

Par exemple, pour accéder à la page de détails où pk vaut 1, ce serait `` diary / detail / 1 / ''. Cela n'est pas nécessaire pour les pages de liste et les pages supplémentaires qui ne sont pas liées à un article spécifique.

forms.py Avant de créer views.py, créez un nouveau fichier appelé forms.py. Créez un fichier appelé forms.py dans le même dossier que views.py (Second \ diary) Veuillez faire le contenu comme suit.

Second\diary\forms.py


from django import forms
from .models import Day


class DayCreateForm(forms.ModelForm):

    class Meta:
        model = Day
        fields = '__all__'

Bien entendu, lors de la création ou de la mise à jour d'un article, un champ de saisie est obligatoire dans le fichier HTML. Afin de créer le champ de saisie, il est nécessaire de configurer quelque chose appelé Formulaire dans le fichier HTML.

C'est ce forms.py qui définit le type de données transmises à ce formulaire. Cette fois, passons toutes les données de la classe Day définie dans models.py. Si vous voulez tout passer, définissez `` fields = '__ all __' ''.

Le nom de classe DayCreateForm est arbitraire, La classe Meta est une phrase fixe. Ne le changeons pas.

views.py Créez une fonction pour afficher la liste, ajouter, mettre à jour, supprimer et détailler les pages dans views.py. À l'origine, il peut être facilement écrit en utilisant la fonction divine de Django appelée vue générale basée sur les classes. Puisque cet article parle d'écrire avec une fonction, j'ose l'écrire avec une fonction.

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):
    """
Afficher une liste d'agenda
    """
    context = {
        'day_list':Day.objects.all(),
    }
    return render(request, 'diary/day_index.html', context)


def add(request):
    """
Article de journal ajouté
    """
    #Créez un formulaire basé sur le contenu soumis. Si ce n'est pas POST, créez un formulaire vide.
    form = DayCreateForm(request.POST or None)

    # method==POST est lorsque le bouton d'envoi est enfoncé. forme.is_valid est True s'il n'y a aucun problème avec le contenu d'entrée.
    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect('diary:index')
    
    #S'il y a une erreur dans l'accès normal ou le contenu d'entrée, jour à nouveau_form.Afficher html
    context = {
        'form':form
    }
    return render(request, 'diary/day_form.html', context)


def update(request, pk):
    """
Article de journal modifié
    """
    #Get Day en fonction de l'url pk (pk est le même que id)
    day = get_object_or_404(Day, pk=pk)

    #Lier le jour acquis au formulaire
    form = DayCreateForm(request.POST or None, instance=day)

    # method=POST(Appuyez sur le bouton d'envoi), Et s'il n'y a pas de problème avec le contenu d'entrée, enregistrez le formulaire.
    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect('diary:index')
    
    #Afficher la première page en cas de problème d'accès normal ou de contenu d'entrée
    context = {
        'form':form
    }
    return render(request, 'diary/day_form.html', context)


def delete(request, pk):
    """
Supprimer l'article du journal
    """
    #Get Day basé sur le PK de l'URL (pk est le même que id)
    day = get_object_or_404(Day, pk=pk)

    # method=POST(Appuyez sur le bouton d'envoi)
    if request.method == 'POST':
        day.delete()
        return redirect('diary:index')
    
    #Accès normal. Ou accès en cas de problèmes.
    context = {
        'day':day
    }
    return render(request, 'diary/day_delete.html', context)


def detail(request, pk):
    """
Page de détail du journal
    """
    #Get Day en fonction du PK de l'URL
    day = get_object_or_404(Day, pk=pk)

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

def index (request): est une fonction pour afficher une liste d'articles. Affectez toutes les données de la classe Day dans models.py au contexte. Je passe le contexte créé à day_index.html en utilisant la fonction de rendu.

def add (request): est une fonction pour créer un nouvel article. Créez un formulaire basé sur le contenu soumis avec `` form = DayCreateForm (request.POST ou None) ''. S'il est dans l'état avant la soumission, ce sera un formulaire vide. ʻIf request.method == 'POST' et form.is_valid (): `est le processus lorsque le bouton d'envoi est pressé et il n'y a aucun problème avec le contenu. Puisqu'il n'y a pas de problème, enregistrez-le avec form.save () et redirigez vers la page index.html. En cas d'accès normal ou s'il y a une erreur dans l'entrée, passez le contexte à day_form.html avec la fonction render.

def update (request, pk): est une fonction pour changer le contenu de l'article. Lors de l'affichage de cette page de mise à jour, l'URL sera diary / update /

. Nous avons besoin de la clé primaire de l'article à mettre à jour, alors passez pk comme argument. Liez le pk reçu par l'URL à la classe Day et obtenez le contenu de l'article avec le code suivant. day = get_object_or_404(Day, pk=pk) Le traitement suivant est le même flux que la fonction d'ajout.

def delete (request, pk): est une fonction pour supprimer un article. C'est presque le même processus que la mise à jour, mais comme il est supprimé, il n'est pas nécessaire de faire fonctionner le formulaire, il n'est donc pas créé. Supprimez l'article avec day.delete () et redirigez-le vers index.html.

def detail (request, pk): est une fonction pour afficher la page de détail de l'article. C'est simple car vous n'avez pas non plus à créer de formulaire.

Créer un fichier html

Enfin, créez un fichier html. Créez un dossier de modèles sous le dossier Agenda, puis créez un dossier Agenda.

  • Il est plus facile de se souvenir de / <nom de l'application> / templates / <nom de l'application>.

Création de base.html

Tout d'abord, créez base.html. C'est le fichier html qui est le chef-d'œuvre de tout.

  • CSS et JavaScript utilisent Bootstrap.

Liez la page de liste et la création d'un nouvel article dans la partie nav. Lien avec {% url '<nom de l'application>: <valeur de nom définie dans urls.py>'%}.

Second\diary\templates\diary\base.html


<!doctype html>
<html lang="ja">
  <head>
    <title>Application de l'agenda</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' %}">liste</a>
        <a class="nav-link" href="{% url 'diary:add' %}">ajouter à</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>

Création de day_index.html

C'est une page de liste d'articles.

Depuis views.py, day_list reçoit le contexte clé, donc Vous pouvez utiliser day_list pour accéder aux titres des articles et aux dates stockées dans votre base de données. Ceci est affiché à l'aide de l'instruction for.

C'est un mécanisme pour accéder à la page de mise à jour de chaque article en passant day.pk pour mettre à jour et supprimer.

Second\diary\templates\diary\day_index.html


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

{% block content %}

<h1>Liste de journal</h1>

<table class="table">
    <thead>
        <tr>
            <th>Titre</th>
            <th>Date</th>
            <th>Processus de mise à jour</th>
            <th>Supprimer le processus</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 %}">mise à jour</a></td>
            <td><a href="{% url 'diary:delete' day.pk %}">Effacer</a></td>
        </tr>
    {% endfor %}
    </tbody>
</table>

{% endblock %}

Création de day_detail.html

Ceci est la page de détails. Le titre, le texte et la date s'affichent. Les sauts de ligne sont ajoutés après le texte Il s'agit d'exprimer des sauts de ligne sur HTML. Il n'y a pas de problème même sans cela.

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


{% extends 'diary/base.html' %}
{% block content %}
    <table class="table">
        <tr>
            <th>Titre</th>
            <td>{{ day.title }}</td>
        </tr>
        <tr>
            <th>Texte</th>
            <td>{{ day.text | linebreaksbr}}</td>
        </tr>
        <tr>
            <th>Date</th>
            <td>{{ day.date }}</td>
        </tr>
    </table>
    <a href="{% url 'diary:update' day.pk %}"><button class="btn btn-primary">mise à jour</button></a>
    <a href="{% url 'diary:delete' day.pk %}"><button class="btn btn-danger">Effacer</button></a>    
    
{% endblock %}

Création de day_form.html

Créer un formulaire. Il est utilisé pour créer et mettre à jour des articles.

Second\diary\templates\diary\day_form.html


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

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

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

Création de day_delete.html

Un contenu similaire continue, mais c'est la fin. Le dernier est la page de suppression.

Second\diary\templates\diary\day_delete.html


{% extends 'diary/base.html' %}
{% block content %}
<form action="" method="POST">
    <table class="table">
        <tr>
            <th>Titre</th>
            <td>{{ day.title }}</td>
        </tr>
        <tr>
            <th>Texte</th>
            <td>{{ day.text }}</td>
        </tr>
        <tr>
            <th>Date</th>
            <td>{{ day.date }}</td>
        </tr>
    </table>
    <p>Supprimez ces données.</p>
    <button type="submit" class="btn btn-primary">Effacer</button>
    {% csrf_token %}
</form>
{% endblock %}

Contrôle de fonctionnement

Après cela, vérifions le fonctionnement avec le serveur d'exécution py manage.py. Si vous pouvez créer / mettre à jour / supprimer un article, vous réussissez.

Recommended Posts

Django super introduction par les débutants Python! Partie 4 J'ai créé une application de journal super simple (créée uniquement avec des fonctions sans utiliser de vues à usage général basées sur les classes)
Django super introduction par les débutants Python! Partie 5 J'ai créé une application de journal super simple avec une vue générale basée sur la classe
Django super introduction par les débutants Python! Partie 2 J'ai essayé d'utiliser les fonctions pratiques du modèle
Django super introduction par les débutants Python! Partie 3 J'ai essayé d'utiliser la fonction d'héritage de fichier de modèle
Django super introduction par les débutants Python! Partie 6 J'ai essayé d'implémenter la fonction de connexion
Django super introduction par les débutants Python! Partie 1 J'ai essayé d'afficher une page HTML qui ne dit que "Hello World"
J'ai créé une application de livre simple avec python + Flask ~ Introduction ~
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai fait une application WEB avec Django
J'ai créé une application graphique avec Python + PyQt5
(Python) Essayez de développer une application Web en utilisant Django
J'ai créé un package pour filtrer les séries chronologiques avec python
Explication facile à comprendre de l'application Web Python (Django) même pour les débutants (5) [Introduction au fonctionnement de la base de données avec le shell Django]
J'ai créé une bibliothèque qui lit facilement les fichiers de configuration avec Python
[Python] Un mémo pour faire fonctionner une ROM créée avec GBDK avec PyBoy
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai créé un chat-holdem de serveur de jeu de poker en utilisant websocket avec python
J'ai fait un Line-bot avec Python!
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
J'ai créé une application Web en Python qui convertit Markdown en HTML
[Django] a créé un champ pour saisir des dates avec des nombres à 4 chiffres
Les débutants en Python publient des applications Web à l'aide de l'apprentissage automatique [Partie 2] Introduction à Python explosif !!
[Streamlit] Je déteste JavaScript, donc je crée une application Web uniquement avec Python
Je souhaite créer une application Web en utilisant React et Python flask
Implémentez une application simple avec Python full scratch sans utiliser de framework web.
Application Web utilisant Bottle (1)
Créer une liste Django Todo
Création de liste de tâches [Python Django]
J'ai essayé de créer une application todo en utilisant une bouteille avec python
Introduction à la création d'IA avec Python! Partie 3 J'ai essayé de classer et de prédire les images avec un réseau de neurones convolutifs (CNN)
Introduction à la création d'IA avec Python! Partie 2 J'ai essayé de prédire le prix de l'immobilier dans la ville de Boston avec un réseau neuronal