[PYTHON] Les débutants de Django créent des applications simples 5

introduction

Django Une suite de 4 pour les débutants pour créer des applications simples. Le but est d'éliminer autant que possible les choses compliquées et gênantes, de créer une application Web simplifiée et d'apprendre comment fonctionne Django. Ne comprenez que ce qui est connecté et comment il se déplace autour du back-end. Si vous implémentez CRUD (créer, lire, mettre à jour, supprimer) et vous déplacer en toute sécurité, vous atteindrez l'objectif. La dernière fois, j'ai réécrit Class-based-view en Function-view et comparé les deux pour voir comment Django fonctionne. Cette fois, je voudrais implémenter la partie mise à jour et supprimer la partie de CRUD. Donc, en fait, c'est complet.

Une série pour les débutants pour créer des applications simples

environnement

Ubuntu 20.04 LTS Python 3.8.2 Django 3.02

supposition

Le nom du projet est config et le nom de l'application est myapp. En d'autres termes, les deux commandes suivantes ont été exécutées


(myenv)$ django-admin startproject config .
(myenv)$ python manage.py startapp myapp

Le répertoire des modèles est créé dans la même hiérarchie que manage.py et setting.py a également été modifié. (Voir «Django Beginners Create Easy Apps 1)

1. Mise en œuvre de la partie mise à jour

Image approximative

Le journal est affiché sur la page de l'écran des détails du film, et lorsque vous souhaitez modifier le journal pendant un certain temps, vous pouvez le modifier en appuyant sur le bouton.

5FF00F76-C9CC-4796-B073-754EAA3173C2.jpeg

Lors de la création d'une nouvelle page, créez-la dans l'ordre urls.py → views.py → template. Je pense que l'omission de la pensée sera réduite en adaptant la méthode de fabrication dans un moule de cette manière. Tout d'abord, écrivez l'adresse ʻupdate / log / <int: pk> / `lors de la mise à jour du journal (impression) dans urls.py.

urls.py (partie mise à jour)

myapp/urls.py


from django.urls import path, include
from myapp import views

app_name = 'myapp'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('movie/<int:pk>/', views.MovieDetailView.as_view(), name='movie_detail'),
    # (Omission)
    path('update/log/<int:pk>/', views.UpdateLogView.as_view(), name='updatelog'), #Ajouter cette ligne
]

views.py (partie de mise à jour)

Ensuite, écrivez le code de UpdateLogView qui est une vue basée sur les classes dans views.py.

myapp/views.py



class UpdateLogView(generic.UpdateView):
    model = Log
    form_class = LogForm
    template_name = "myapp/register.html"
    def get_success_url(self):
        return reverse('myapp:movie_detail', kwargs={'pk': self.object.movie.pk })

#Si Fonction-Si vous écrivez en vue, c'est comme suit

def updatelog(request, pk):
    obj = get_object_or_404(Log, id=pk)
    if request.method == "POST":
        form = LogForm(request.POST, instance=obj)
        if form.is_valid():
            form.save()
            return redirect('myapp:movie_detail', pk=obj.movie.pk)
    else:
        form = LogForm(instance=obj)
        return render(request, 'myapp/register.html', {'form': form})

Quatre éléments doivent être spécifiés dans Class UpdateLogView (identique à la précédente CreateView).

  1. Quel modèle utiliser
  2. Quoi utiliser pour le formulaire
  3. Quel modèle utiliser
  4. Où voler en cas de succès

Ainsi, vous pouvez voir comment cela fonctionne réellement avec le journal de mise à jour def dans Function-view. La partie request de (request, pk) est un objet HttpRequest qui peut être créé en appuyant sur le bouton d'édition dans detail.html. Le numéro d'identification du journal est entré dans la partie pk. En utilisant ce pk, un nombre est entré dans la partie <int: pk> de ʻupdate / log / <int: pk> / `dans urls.py. Remarque ci-dessous.

F87D58D8-8228-4E22-AB65-5682ABBC5233.jpeg

Ceci termine l'implémentation de la mise à jour. Ensuite, implémentez la partie Delete.

2. Mise en œuvre de la partie Delete

Image approximative

Je veux deux fonctions, l'une pour effacer le journal (impression) et l'autre pour effacer les données du film. Ensuite, vous devez écrire deux morceaux de code dans urls.py et deux dans views.py.

urls.py (supprimer une partie)

myapp/urls.py



from django.urls import path, include
from myapp import views

app_name = 'myapp'
urlpatterns = [
    path('', views.index, name='index'),
    # (Omission)
    path('delete/log/<int:pk>/', views.deletelog, name='deletelog'), #Ajouter cette ligne
    path('delete/movie/<int:pk>/', views.deletemovie, name='deletemovie'), #Ajouter cette ligne
]

L'adresse décrite ici est l'écran de confirmation de la suppression. L'endroit où "Puis-je effacer ça?" Ensuite, écrivez le code dans views.py.

views.py (la partie qui efface l'impression)

myapp/views.py



class DeleteLogView(generic.DeleteView):
    model = Log
    def get_success_url(self):
        return reverse('myapp:movie_detail', kwargs={'pk': self.object.movie.pk })

#Fonction à partir d'ici-view

def deletelog(request, pk):
    obj = get_object_or_404(Log, id=pk)
    movie_id = obj.movie.pk
    if request.method =="POST": 
        obj.delete() 
        return redirect('myapp:movie_detail', pk=movie_id)
    context = {'obj':obj}
    return render(request, "myapp/delete.html", context)

Dans la vue basée sur les classes, tout ce que vous avez à faire est de spécifier le modèle et la page à ignorer en cas de réussite. Cependant, s'il n'y a que ces deux éléments, le nom de la page de confirmation de suppression doit être "○○ _confirm_delete.html". Le nom du modèle est entré dans 〇〇. Cette fois, ce sera "log_confirm_delete.html". Dans Function-view, "delete.html" a été créé et utilisé comme page de confirmation de suppression.

La vue basée sur la classe le fait automatiquement, et ce que j'ai dû concevoir dans la vue fonctionnelle, c'est qu'après la suppression du journal, l'écran des détails après la suppression s'affiche. Si vous n'enregistrez pas l'ID du film dans le journal avant de supprimer le journal, vous ne pourrez pas revenir à l'écran des détails du film. Remarque ci-dessous.

51EECC10-5523-49E7-A77E-1ACD0A0D133B.jpeg

views.py (la partie qui efface les données du film)

myapp/views.py



class DeleteMovieView(generic.DeleteView):
    model = Movie
    def get_success_url(self):
        return reverse('myapp:index')

#Fonction à partir d'ici-view

def deletemovie(request, pk):
    obj = get_object_or_404(Movie, id=pk)
    if request.method == "POST":
        obj.delete()
        return redirect('myapp:index')
    context = {'obj':obj}
    return render(request, "myapp/delete.html", context)

Le code est presque une répétition du journal de suppression. La seule différence est qu'il passe à l'index après la suppression.

Ecrire la partie du modèle

Ce modèle est l'écran de confirmation de suppression (delete.html). Le même fichier delete.html peut être utilisé, que le journal soit supprimé ou que les données du film soient supprimées. Bien que l'affichage semble maladroit (l'un des haut et bas est vide).

myapp/templates/myapp/delete.html


<form method="POST">
    {% csrf_token %}
    {{obj.movie}}<br> #Ceci s'affiche lors de la suppression du journal
    {{obj.text}}<br>
------------------------------<br>
    {{obj.title}}<br> #Ceci s'affiche lorsque vous supprimez le film
    {{obj.director}}<br>
    Do you want to delete it?<br>
    <button type="submit">OK</button>
</form>

Ajoutez des boutons d'édition et de suppression à detail.html avec

templates/myapp/detail.html


{% for log in movie.log.all %}
    <li>
        <button onclick="location.href='{% url 'myapp:updatelog' log.id %}'">edit</button>
        <button onclick="location.href='{% url 'myapp:deletelog' log.id %}'">delete</button>
        {{ log.text }}
    </li>

{% endfor %}

Ceci termine l'implémentation de la partie Delete.

Autre réglage fin

--Mettez un lien dans index.html pour accéder à chaque page

index.html


<a href="{% url 'myapp:registerdirector' %}">Register Director</a><br>
<a href="{% url 'myapp:registermovie' %}">Register Movie</a><br>
<a href="{% url 'myapp:writinglog' %}">Writing Log</a>

--Ajoutez une fonction + un lien pour pouvoir entrer le journal du film à partir de detail.html

views.py


def writingthismovielog(request, movie_id):
    obj = get_object_or_404(Movie, id=movie_id)
    form = LogForm({'movie':obj})
    if request.method == "POST":
        form = LogForm(request.POST)
        if form.is_valid():
            l = form.save(commit=False)
            l.save()
            return redirect('myapp:movie_detail', pk=l.movie.pk)
    else:
        return render(request, 'myapp/register.html', {'form': form})

Lorsque j'ai appuyé sur le bouton, seul le titre du film était déjà entré, et je voulais juste écrire mes impressions. Le point d'ingéniosité est form = LogForm ({'movie': obj}). Vous avez créé un objet, spécifié la partie titre dans un type de dictionnaire et l'avez placé dans LogForm. Je l'ai essayé et cela a fonctionné. C'est parce que ça devrait être comme ça! C'est amusant si cela fonctionne comme je m'y attendais. C'est juste cette ligne, mais j'en suis vraiment content.

detail.html


<a href="{% url 'myapp:writingthismovielog' movie.id %}">Write log of this movie data</a><br>
<a href="{% url 'myapp:deletemovie' movie.id %}">Delete this movie data</a><br>
<a href="{% url 'myapp:index' %}">To Index</a><br>

Collez ensuite le lien ci-dessus dans detail.html et complétez le réglage fin.

Cela fonctionne comme ça ... Terminé! !!

Update and Delete Log Delete Movie data
editdelete.gif deletemovie.gif

Pour la vidéo gif ci-dessus, utilisez SimpleScreenRecord pour capturer l'écran sous forme de vidéo et ffmpeg pour convertir la vidéo en gif. C'est facile à faire et c'est désaccordé. Le monde ne va-t-il pas trop loin?

Épilogue

J'ai pu implémenter CRUD (Créer, Lire, Mettre à jour, Supprimer), bien qu'il n'ait pas été déployé et avait l'air mauvais, dans le but juste de travailler. Au moins ça marche. Donc, ** Goooooooaaaaallll! ** J'ai pu maintenir les bases minimales. Cette application (Modoki) est devenue la première expérience avec le sentiment que "j'ai pu programmer tout seul!", Ce qui a conduit à une légère confiance que j'ai fait 0 à 1. Nommez ce "movielogrecord" et mettez le code sur github. L'ignorance et la honte sont ouvertes au public. https://github.com/soh506/movielogrecord.git. Merci pour la lecture. Nous sommes impatients de vous aider même un peu. Ensuite, étudions le frontal pour le rendre meilleur. L'étude de l'éternel débutant continue ...

Recommended Posts

Les débutants de Django créent des applications simples 2
Les débutants de Django créent des applications simples 5
Créer un planning Django
tutoriel simple django oscar
Créer une liste Django Todo
Créer une API avec Django
Créer un serveur REST (simple)
Création de liste de tâches [Python Django]
Créer une page d'accueil avec django
Shell pour créer un projet django
Créer un écran de connexion Django
Créez votre propre middleware Django
Créer un serveur textlint simple
Créer et lister des modèles Django
(Pour les débutants) Essayez de créer une API Web simple avec Django
Hello World (débutant) avec Django
Créez une API d'intégration sociale pour les applications smartphone avec Django
Les utilisateurs de Rails essaient de créer un moteur de blog simple avec Django
Étapes pour créer un projet Django
Django débutant a essayé de créer l'environnement
[Pour les débutants] Django -Construction d'environnement de développement-
Créer une nouvelle application utiliser python, django
[Django] Créez votre propre page d'erreur 403, 404, 500
Créer un téléchargeur de fichiers avec Django