空白 link 与 get_absolute_url
Blank link with get_absolute_url
我尝试在 lista_libri.html 和 lista_generi.html 之间创建一个 link,使用 get_absolute_url。我已经在 autore.html 和 lista_libri.html 之间创建了一个 link 并且运行良好。
但是如果我在 lista_libri.html 和 lista_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 %}
我尝试在 lista_libri.html 和 lista_generi.html 之间创建一个 link,使用 get_absolute_url。我已经在 autore.html 和 lista_libri.html 之间创建了一个 link 并且运行良好。
但是如果我在 lista_libri.html 和 lista_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 %}