Salve a tutti.
Ho una domanda alla quale non riesco a trovare risposta.
Ho cercato da tutte le parti, e nonostante guide e tutorial mi facciano credere sia possibile ottenere ciò che voglio, non riesco a trovare esempi esplicativi (codice) che mi aiutino a capire come fare.
In pratica lo scenario è questo: voglio creare una homepage, pagina principale del mio sito, che sia composta da sezioni che richiamino delle "viste" già definite nelle applicazioni per le quali sono state create.
Ad esempio: ((anche se è un esempio senza senso mi serve per capire il meccanismo) (scusate ma non sta funzionando l'evidenziazione del codice)
Ho un applicazione "posts" con modello Post e la vista associata "posts_list" che all'url
www.miosito.it/posts mi restituisce la lista dei nomi dei post nel template posts.html che estende base.html.
views.py (di posts)
from django.shortcuts import render
def post_list(request):
posts=Post.objects.all()
return render(request, 'post_list.html', {'posts':posts})
urls.py (di posts)
urlpatterns = [
url('', views.posts_list, name='post_list'),
}
posts.html (di posts)
{% extends 'base.html' %}
{% block content %}
{% for post in posts %}
<div class="post">
<div class="date">
{{ post.published_date }}
</div>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
{% endblock %}
Poi ho un applicazione "books" con modello Book la cui vista "books_list" all'url
www.miosito.it/books mi restituisce la lista dei nomi dei libri nel template books.html che estende base.html.
views.py (di books)
from django.shortcuts import render
def books_list(request):
books=books.objects.all()
return render(request, 'books_list.html', {'books':books})
urls.py (di books)
urlpatterns = [
url('', views.books_list, name='book_list'),
}
books.html (di books)
{% extends 'base.html' %}
{% block content %}
{% for book in books %}
<div class="book">
<div class="date">
{{ book.published_date }}
</div>
<h1><a href="">{{ book.title }}</a></h1>
<p>{{ book.text|linebreaksbr }}</p>
</div>
{% endfor %}
{% endblock %}
E naturalmente in urls.py nella root ho:
path('admin/', admin.site.urls),
path('posts/', include('posts.urls')),
path('books/',include('books.urls')),
In questo modo sia quando utilizzo
www.miosito.it/posts sia
www.miosito.it/books posso avere la lista dei post e la lista dei libri.
Ora voglio creare una homepage con due sezioni e voglio che in una ci sia la lista dei post con template posts.html e nell'altra la lista dei libri con template books.html.
Ho pensato di creare una vista "index" ed un template "home.html" per il contenuto della home che estende il base.html, in modo che, recuperando i post con Posts.objects.all() e i libri con Books.objects.all() posso creare un contesto e utilizzarlo. Ma in questo modo mi nascono dei dubbi (ed errori).
views.py (di home)
from django.shortcuts import render
def index(request):
books=books.objects.all()
posts=posts.objects.all()
return render(request, 'home.html', {'books':books , 'posts':posts })
urls.py (di home)
urlpatterns = [
url('', views.home, name='index'),
}
home.html (di home)
{% extends 'base.html' %}
{% block content %}
<div id="books">{% for book in books %}
<div class="book">
<div class="date">
{{ book.published_date }}
</div>
<h1><a href="">{{ book.title }}</a></h1>
<p>{{ book.text|linebreaksbr }}</p>
</div>
{% endfor %}
</div>
<div id="posts">
{% for post in posts %}
<div class="post">
<div class="date">
{{ post.published_date }}
</div>
<h1><a href="">{{ post.title }}</a></h1>
<p>{{ post.text|linebreaksbr }}</p>
</div>
{% endfor %}
</div>
{% endblock %}
E in urls.py della root ho aggiunto:
path(''), include('home.urls'),
Domanda:
Visto che ho già un template posts.html e uno books.html, come posso riutilizzarli e includerli nel template "home.html"?
La direttiva {%include 'posts.html' %} e {%include 'books.html' %} forse mi permette di avere questo risultato, ma se faccio questo ottengo un "recursive error" in quanto i templates in questione riestendono base.html .
Se invece elimino la direttiva {%extends base.html %} da entrambi i template posts.html e books.html, visualizzo tutto l'html dei templates ma non riesco a visualizzare il contesto passato dalla vista principale "index".
Mi potete fare un esempio di template e vista in modo da capire come posso fare per poter fare inclusioni multiple o per risolvere questo tipo di scenario?
Non sto veramente riuscendo a capire. Grazie
Maurizio