08. Renderizzare Post Singoli
Utilizzeremo una delle Generic Display Views anche per quanto riguarda i post singoli. Vedremo come creare una funzione view per i post singoli nel dettaglio in una serie successiva. Nello specifico, stavolta useremo Detail View.
Avendola già importata, ci basta integrarla nel file urls.py dell'applicazione, in questo modo:
urlpatterns = [
path('', ListView.as_view(
queryset = Post.objects.all().order_by("-data"),
template_name = "lista_post.html"), name = "lista"),
path('<str:slug>/<int:pk>/', DetailView.as_view(
model = Post,
template_name = "post_singolo.html",), name="singolo"),
path('contatti/', views.contatti, name='contatti'),
]
Come vedete, abbiamo passato solo due parametri: il model e il template. La funzione penserà a fare il rendering per noi!
ATTENZIONE: L'utilizzo di una CBV (Class Based View) richiamata direttamente nel file urls.py come mostrato in questa lezione, non è tipico, seppur comunque fattibile. Normalmente, le views, sia class based che function based, vengono definite comunque all'interno del file views.py, come abbiamo visto nella lezione Architettura MTV, Urls e Views. In questo breve corso introduttivo ho cercato di trovare un compromesso tra il mostrare la gran potenza di Django nel permettere di creare web app di una certa complessità scrivendo davvero poche righe di codice. Per un corso completo, dai uno sguardo a Guida Pratica e Completa a Django, Python e Bootstrap.
Modifichiamo il template post_singolo.html per fargli mostrare il contenuto di un singolo post
Dobbiamo, chiaramente, fare anche qualche modifica al template post_singolo.html, in modo da prepararlo ad accogliere il contenuto che vogliamo visualizzare. Nello specifico ci interessano Titolo del Post, la Data e, chiaramente, il Contenuto! Anche stavolta usiamo alcuni filtri del Django Template Engine, nello specifico safe e linebreaks, in modo da far si che qualora utilizzassimo codice html questo venga interpretato correttamente.
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<title>Post Singolo</title>
</head>
<body>
<h1>{{ object.titolo }}</h1>
<h4>{{ object.data }}</h4>
{{ object.contenuto|safe|linebreaks }}
</body>>
</html>
Nella prossima lezione creeremo un nuovo metodo per la classe Post in models.py chiamato get_absolute_url per ottenere i link per gli URL del nostro post automaticamente.