Créer la vue pour afficher un article
Exclusif Premium
Débloquez votre potentiel ! ✨
Cette session fait partie de notre programme Premium exclusif
+100h de formations exclusives
+180 exercices de code avancés
+100h de mentorats en réécriture
20 projets guidés pas à pas
Mentorats groupés hebdomadaires
Support individuel avec nos mentors
Prêt à passer au niveau supérieur ?
Découvrez tous les avantages Premium et transformez votre apprentissage dès aujourd'hui!
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compteToutes les questions

Thibaut
2 octobre 2024
Résolue
1 réponse
Problème d'affichage dans la vue de détail du blog
Salut Docstring j ai ecris le code pour affiche ma vue de deatial mais je ne vois aucun article afficher aliors tous mon code fonctione bien. Toutres mes autres vues fonctionnent sans souci (Create Update delete) 
voila code au niveau de mon fichier hltml. NOter que j ai pas voulu intergrer le block Title, mais ca ne dois pas poser un problem vu que toutes mes autres vues fonctionent sans souci.    Toutes mes vues fonctinnent bien. La vue de tail ne m:affiche pas d'erreur mais elle n'affiche pas aussi mes aricles.
```django
{% extends "base.html" %}
{% block content %}
{{ post.title }}
{{ post.content|linebreaks|safe }}
{% endblock %}
```
```python
from django.urls import path
from posts.views import BlogHome, BlogPostCreate, BlogPostUpdate, BlogPostDetail, BlogPostDelete
app_name = "posts"
urlpatterns = [
path('', BlogHome.as_view(), name="home"), # ici c'est la vue d#ensemble du blog
path('create/', BlogPostCreate.as_view(), name="create"), # fonctione
path('/', BlogPostDetail.as_view(), name="post"), # pas vraiment a revoir
path('edit//', BlogPostUpdate.as_view(), name="edit"), # fonctione
path('delete//', BlogPostDelete.as_view(), name="delete"), # fonctione
]
```
```python
meas vues
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.urls import reverse_lazy
from django.utils.decorators import method_decorator
from django.views.generic import ListView, CreateView, UpdateView, DetailView, DeleteView
from posts.models import BlogPost
class BlogHome(ListView):
model = BlogPost
context_object_name = "posts"
def get_queryset(self):
queryset = super().get_queryset()
if self.request.user.is_authenticated:
return queryset
return queryset.filter(published=True)
@method_decorator(login_required, name='dispatch') # restreindre cette vu au user pas connecter
class BlogPostCreate(CreateView):
model = BlogPost
template_name = "posts/blogpost_create.html"
fields = ['title', 'content', ]
@method_decorator(login_required, name='dispatch')
class BlogPostUpdate(UpdateView):
model = BlogPost
template_name = "posts/blogpost_edit.html"
fields = ['title', 'content', 'published', ]
@method_decorator(login_required, name='dispatch')
class BlogPostDetail(DetailView):
model = BlogPost
content_object_name = "post"
@method_decorator(login_required, name='dispatch')
class BlogPostDelete(DeleteView):
model = BlogPost
content_object_name = "post"
success_url = reverse_lazy("posts:home")
```
```python
tous mes urls
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include
from store.views import index, product_detail, add_to_cart, cart,delete_cart
from accounts.views import signup, logout_user, login_user
from shop import settings
urlpatterns = [
path('', index, name='index'),
path('admin/', admin.site.urls),
path('blog/', include('posts.urls')),
path('signup/', signup, name='signup'),
path('login/', login_user, name='login'),
path('logout/', logout_user, name='logout'),
path('cart/', cart, name='cart'),
path('cart/selete', delete_cart, name='delete_cart'),
path('product/', product_detail, name="product"),
path('product//add-to-cart/', add_to_cart, name="add_to_cart"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
```
```python
Mes URls concatenees
from django.urls import path
from posts.views import BlogHome, BlogPostCreate, BlogPostUpdate, BlogPostDetail, BlogPostDelete
app_name = "posts"
urlpatterns = [
path('', BlogHome.as_view(), name="home"), # ici c'est la vue d#ensemble du blog
path('create/', BlogPostCreate.as_view(), name="create"), # fonctione
path('/', BlogPostDetail.as_view(), name="post"), # pas vraiment a revoir
path('edit//', BlogPostUpdate.as_view(), name="edit"), # fonctione
path('delete//', BlogPostDelete.as_view(), name="delete"), # fonctione
]
```
```html
mon fichier de base html
La boutique de Couture
Accueil
{% if request.user.is_authenticated %}
Ajouter un articlede blog
{% endif %}
La boutique de couture
{% if user.is_authenticated %}
{{ user.username }}
Deconnection
{% else %}
Connection
S'inscrie
{% endif %}
{% if user.cart %}
Voir le panier({{ user.cart.orders.count }})
{% endif %}
{% block content %}
{% endblock %}
```
Merci d 'avance
Cordialement Thibaut

Loudo
18 août 2023
Résolue
2 réponses
L'ordre des path dans urlspatterne a une importance ?
Bonjour,
J'ai bug étrange sur l'url de ma vue "BlogPostCreate" crée précédement.
Tout fonctionnait jusqu'ici. J'avais ça comme ordre dans mes urlpatterns :
```
from django.urls import path
from posts.views import (
BlogHome,
BlogPostCreate,
BlogPostUpdate,
)
app_name = "posts"
urlpatterns = [
path('', BlogHome.as_view(), name='home'),
path('create/', BlogPostCreate.as_view(), name='create'),
path('edit/', BlogPostUpdate.as_view(), name='edit'),
]
```
Pour cette partie de la vidéo je crée la vue BlogPostDetail et je définie mes urls comme ceci :
```
#...
app_name = "posts"
urlpatterns = [
path('', BlogHome.as_view(), name='home'),
path('/', BlogPostDetail.as_view(), name='post'),
path('create/', BlogPostCreate.as_view(), name='create'),
path('edit/', BlogPostUpdate.as_view(), name='edit'),
]
```
Et là bug ma vue create ne focntionne plus et le reste oui !🤨
Et juste en changeant l'ordre des chemins, en mettant 'create' en deuxième position ça refonctionne :
```
app_name = "posts"
urlpatterns = [
path('', BlogHome.as_view(), name='home'),
path('create/', BlogPostCreate.as_view(), name='create'),
path('/', BlogPostDetail.as_view(), name='post'),
path('edit/', BlogPostUpdate.as_view(), name='edit'),
]
```
Est ce que c'est normale ? Dans la vidéo Thibault il met 'create en troisième position et ça fonctionne chez lui !?! 🤔
00:00:00 :Maintenant qu'on a vu comment afficher tous les articles sur notre page d'accueil, comment créerun article et comment le modifier, on va voir comment afficher un article. Donc comment afficher
00:00:09 :un article au complet puisque pour l'instant on a juste les articles avec les extraits sur la paged'accueil mais on ne peut pas afficher l'entièreté d'un article. Pour ça on va utiliser une vue de
00:00:18 :détail, donc Detail View, que l'on va créer à la suite de nos deux vues ici, donc dans le fichierViews.py. Donc on va importer déjà tout en haut notre vue Detail View cette fois-ci et on va créer
00:00:30 :une classe qui va hériter de ce Detail View. Donc on va l'appeler BlockPostDetail et on va la fairehériter de Detail View. Je vais ensuite là encore renseigner le modèle, donc BlockPost encore une
00:00:42 :fois, c'est toujours le même, et on va changer également le ContextObjectName puisqu'on souhaiteutiliser la chaîne de caractère Post plutôt que la chaîne Object qui est disponible par défautdans les vues de détail. Donc là comme il s'agit d'un article je préfère avoir quelque chose d'un
00:00:55 :peu plus explicite en le spécifiant ici. On va ensuite avoir un template qui va être automatiquementrécupéré par Django, ce template c'est le nom du modèle tout en minuscules, tiré du bas etDetail. Donc je vais le créer ici dans le template, donc dans le dossier TemplatePost, on fait un
00:01:10 :clic droit New, HTML File, donc BlockPost donc le nom du modèle tout en minuscules et Detail.html.Je valide avec Entrée et on va modifier ici ce template. Donc là encore je vais copier le code
00:01:22 :et je vais vous l'expliquer. Donc on va mettre tout ça ici, là encore on étend notre vue donc avecExtend, donc on étend le fichier HTML de base, on remplace le titre, cette fois-ci on utilise donccette variable Post qui est la variable que l'on a modifiée, donc on a modifié notre objet ici avec
00:01:38 :l'attribut ContextObjectName, comme je vous disais si on ne l'avait pas spécifié à la place onutiliserait Object. Dans ce cas-ci on va mettre Post.title, donc on ajoute le titre et on va
00:01:47 :l'afficher dans la balise titre de notre page. Et ensuite on affiche tout simplement l'articledans une balise article avec le titre h1 ici, Post.title, donc on remet l'attribut title et
00:01:57 :on va afficher le contenu de notre article, donc Content. On met un line break ici, donc ça ça vapermettre de tout simplement convertir les sauts de lignes, donc les sauts de lignes SlashN commececi, en sauts de lignes HTML avec la balise br comme ceci qui est un saut de ligne donc break
00:02:12 :en HTML. On va ensuite utiliser la balise safe pour interpréter les balises qu'on pourrait avoir àl'intérieur du contenu de notre article, donc si on avait des balises de paragraphes ou de titreselles seraient correctement affichées sur notre article. Donc on met tout ça à l'intérieur d'un
00:02:27 :div et c'est tout ce qu'on fait ici, donc on a notre vue qui va récupérer ce fichier, qui vautiliser blog post et pour savoir quel blog post il doit afficher, donc quel article il doit afficher,tout ça ça va être fait là encore à partir de l'URL. Donc dans l'URL ici je vais rajouter encore
00:02:43 :une fois un chemin, donc je duplique ma ligne ici et on va récupérer le slug de l'article,donc on va remettre le plus grand et plus petit comme ceci avec le slug et on va le mettre doncdirectement ici en deuxième position, on va mettre string slug, donc ça veut dire que pour accéder à
00:02:58 :un article on va mettre par exemple blog et un cinquième article ici, donc ça c'est le slugd'un article en particulier, donc le dernier que j'ai créé. Donc pour accéder à un article on fait
00:03:08 :tout simplement blog slash et le slug de l'article. Ici à la place de blog post create donc bien sûron va mettre notre blog post detail, donc on importe blog post detail et on le retourne entant que vue ici, donc blog post detail point as view et ici à la place de create on va mettre
00:03:23 :post tout simplement. Donc normalement on a tout ce qu'il faut ici, je vais essayer d'accéder à cecinquième article en validant mon URL ici et là on a bien l'article qui est affiché. Je vais essayer
00:03:33 :d'en afficher un autre un peu plus long pour vous montrer ce que ça donne. Donc si je reviens dansarticle, on va prendre le deuxième article par exemple qui avait le lorem ipsum, donc je prendsle slug, je le mets ici à la place du slug que j'avais et là on a bien donc le titre de l'article.
Ce n'est pas fini...
✋
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.