空白 link 与 get_absolute_url

Blank link with get_absolute_url

我尝试在 lista_libri.htmllista_generi.html 之间创建一个 link,使用 get_absolute_url。我已经在 autore.htmllista_libri.html 之间创建了一个 link 并且运行良好。

但是如果我在 lista_libri.htmllista_generi.html 之间激活 link,结果空白。

下面我分享定义模型、视图和模板的代码字符串。

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 %}

怎么了?

{{ libro.genere.get_absolute_url }}

libro.genere 不是 Genere 实例。它是一个 ManyRelatedManager ,您可以使用它来访问相关实例。由于 libro.genere 没有 get_absolute_url 方法,因此在呈现的模板中它被评估为空字符串 ''

您已经在循环 {% for genere in libro.genere.all %},因此您应该使用 {{ genere.get_absolute_url }}

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