MaxDragonheart
MaxDragonheart

Reputation: 1290

Blank link with get_absolute_url

I try to create a link between lista_libri.html and lista_generi.html, using get_absolute_url. I've create already a link between autore.html and lista_libri.html and it runs well.

But if I active a link between lista_libri.html and lista_generi.html, it results blank.

Below I share the code strings that define model, view and templates.

models.py

from django.db import models
from django.urls import reverse

class Genere(models.Model):
    nome = models.CharField(max_length=20)

    def __str__(self):
        return self.nome

    def get_absolute_url(self):
        return reverse("libri_genere", kwargs={"pk": self.pk})     

    class Meta:
        verbose_name = "Genere"
        verbose_name_plural = "Generi"

class Autore(models.Model):
    nome = models.CharField(max_length=20)
    cognome = models.CharField(max_length=20)
    nazione = models.CharField(max_length=20)

    def __str__(self):
        return self.nome + " " + self.cognome

    def get_absolute_url(self):
        return reverse("profilo_autore", kwargs={"pk": self.pk})

    class Meta:
        verbose_name = "Autore"
        verbose_name_plural = "Autori"

class Libro(models.Model):
    titolo = models.CharField(max_length=100)
    isbn = models.CharField(max_length=13)
    autore = models.ForeignKey(Autore, on_delete=models.CASCADE, related_name="libri")
    genere = models.ManyToManyField(Genere, related_name="generi")

    def __str__(self):
        return self.titolo

    class Meta:
        verbose_name = "Libro"
        verbose_name_plural = "Libri"    

views.py

from django.views.generic.detail import DetailView
from django.views.generic.list import ListView
from .models import Autore, Libro, Genere

class AutoreDCBV(DetailView):
    model = Autore
    template_name = "autore.html"

class LibroLCBV(ListView):
    model = Libro
    template_name = "lista_libri.html"

class GenereDCBV(DetailView):
    model = Genere
    template_name = "lista_generi.html"

urls.py

from django.urls import path
from .views import LibroLCBV, AutoreDCBV, GenereDCBV

urlpatterns = [
    path('', LibroLCBV.as_view(), name='lista_libri'),
    path('autore/<int:pk>/', AutoreDCBV.as_view(), name='profilo_autore'),
    path('genere/<int:pk>/', GenereDCBV.as_view(), name='libri_genere'),
]

lista_generi.html

{% extends 'base.html' %}

{% block head_title %}{{ block.super }} | {{ genere }}{% endblock head_title %}

{% block content %}
  <h1>Genere: {{ nome }}</h1>
  <br>

  {% for gen in genere.generi.all %}

    <h4><strong>Titolo: </strong> {{ gen.titolo }} </h4>
    <h5><strong>Autore: </strong> {{ gen.autore }} </h5>
    <p><strong>ISBN: </strong> {{ gen.isbn }} </p>
    <hr>

  {% endfor %}

{% endblock content %}

lista_libri.html

{% extends 'base.html' %}

{% block head_title %}{{ block.super }} | Libreria{% endblock head_title %}

{% block content %}
  <h1>La nostra libreria:</h1>
  <br>

  {% for libro in object_list %}   

    <h4><strong>Titolo: </strong> {{ libro.titolo }} </h4>
    <h5><strong>Autore: </strong> <a href="{{ libro.autore.get_absolute_url }}">{{ libro.autore }}</a>  </h5>
    <h6><strong>Genere </strong></h6>
        {% for genere in libro.genere.all %}
          <a href="{{ libro.genere.get_absolute_url }}" class="badge badge-success">{{ genere }}</a>
        {% endfor %}
    <p><strong>ISBN: </strong> {{ libro.isbn }} </p>
    <hr>

  {% endfor %}

{% endblock content %}

What is wrong?

Upvotes: 0

Views: 356

Answers (1)

Alasdair
Alasdair

Reputation: 308769

{{ libro.genere.get_absolute_url }}

libro.genere is not a Genere instance. It is a ManyRelatedManager which you can use to access related instance. Since libro.genere does not have a get_absolute_url method, it is evaluated as the empty string '' in the rendered template.

You are already looping through {% for genere in libro.genere.all %}, therefore you should use {{ genere.get_absolute_url }}.

{% for genere in libro.genere.all %}
    <a href="{{ genere.get_absolute_url }}" class="badge badge-success">{{ genere }}</a>
{% endfor %}

Upvotes: 1

Related Questions