Homepage e riutilizzo templates

17 views
Skip to first unread message

Maurizio Mastria

unread,
Feb 21, 2019, 5:28:53 AM2/21/19
to Django-it
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

Romagnoli Emanuele

unread,
Feb 21, 2019, 5:34:31 AM2/21/19
to djan...@googlegroups.com
Non sono riuscito a leggere tutto... Ma qui c'è un errore, manca il context:

views.py  (di posts)
from django.shortcuts import render
def post_list(request):
    posts=Post.objects.all()
    return render(request, 'post_list.html', context =  {'posts':posts})

Potresti anche usare una variabile:

views.py  (di posts)
from django.shortcuts import render
def post_list(request):
    posts=Post.objects.all()
    context =  {'posts':posts}
    return render(request, 'post_list.html', context)



--
Hai ricevuto questo messaggio perché sei iscritto al gruppo "Django-it" di Google Gruppi.
Per annullare l'iscrizione a questo gruppo e non ricevere più le sue email, invia un'email a django-it+...@googlegroups.com.
Per postare in questo gruppo, invia un'email a djan...@googlegroups.com.
Visita questo gruppo all'indirizzo https://groups.google.com/group/django-it.
Per altre opzioni visita https://groups.google.com/d/optout.

Maurizio Mastria

unread,
Feb 21, 2019, 6:16:27 AM2/21/19
to Django-it
Si hai ragione, credo ci siano anche altri errori di importazione, il fatto è che sto scrivendo e riscrivendo il codice e in questo post copiando e incollando non mi sto accorgendo di numerose sviste. Sono veramente alla frutta già stamattina. :D
Però quello che mi interessa è il fulcro del problema.

Maurizio

Romagnoli Emanuele

unread,
Feb 21, 2019, 6:32:47 AM2/21/19
to djan...@googlegroups.com
Il fulcro del tuo problema è che se vuoi avere quello che chiedi ti basta creare un'unica funzione in cui chiami sia post che books e che puoi passare al context.

Salvo smentite, una funzione pesca un unico template che al suo interno può includere altri pezzi di HTML. Tuttavia questi pezzi di codici sono sempre collegati alla stessa funzione e non alle altre... non penso di essere stato chiaro, ma se fai come ti ho detto vedrai che hai risolto il problema 😅

--

Maurizio Mastria

unread,
Feb 21, 2019, 6:41:17 AM2/21/19
to djan...@googlegroups.com
Ok. Credo di aver capito. Non so perché ma mi sto complicando la vita forse perché sto pensando più in grande in vista di un progetto più strutturato. Per ora faccio come hai detto... Magari in futuro le risposte alle mie domande arriveranno, anche perché le stesse mie domande mi mettono in crisi 😂. Comunque grazie.

Karim

unread,
Mar 4, 2019, 1:11:28 AM3/4/19
to Django Italia
On Thu, Feb 21, 2019 at 9:28 PM Maurizio Mastria <mast...@gmail.com> wrote:
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".

Se vuoi riutilizzare lo stesso template, devi solamente passargli il context per essere renderizzato dove vuoi tu.

Io fare una `books.html` e una `books_inner.html` dove la inner e' semplicemente richiamata all'interno della books.html e quindi l'inner rappresenta quella porzione di codice html che puoi riusare dove vuoi.

Nella tua home.html fai l'include di books_inner.html con una differenza, gli passi il context dalla tua home

Quindi se nella tua context della home view, ti sei preso i tuoi posts e i tuoi books nel context, ti bastera' fare l'include cosi'

{% include 'books_inner.html' with books=list_of_books %}

dove `list_of_book` e' la variabile che ti sei preparato nel context nella view di home.

Ciao
 
--
Karim N. Gorjux
Reply all
Reply to author
Forward
0 new messages