我尝试使用get_absolute_url在lista_libri.html和lista_generi.html之间创建一个链接。我已经创建了autore.html和lista_libri.html之间的链接,它运行良好。
但是,如果我在lista_libri.html和lista_generi.html之间激活链接,则结果为空。
下面我分享定义模型,视图和模板的代码字符串。
models.朋友
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.朋友
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.朋友
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 %}