与get_absolute_url的空白链接

时间:2018-08-30 10:26:49

标签: python django python-3.x django-2.1

我尝试使用 get_absolute_url lista_libri.html lista_generi.html 之间创建链接。我已经在 autore.html lista_libri.html 之间建立了链接,并且运行良好。

但是,如果我激活 lista_libri.html lista_generi.html 之间的链接,则该链接为空白。

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

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

怎么了?

1 个答案:

答案 0 :(得分:1)

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