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.
Ubuntu 20.04 LTS Python 3.8.2 Django 3.02
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)
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.
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.
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
]
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).
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.
Ceci termine l'implémentation de la mise à jour. Ensuite, implémentez la partie Delete.
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.
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.
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.
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.
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.
--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.
Update and Delete Log | Delete Movie data |
---|---|
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?
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