与get_absolute_url的空白链接

问题描述 投票:0回答:1

我尝试使用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 %}

怎么了?

python django python-3.x django-2.1
1个回答
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 %}
© www.soinside.com 2019 - 2024. All rights reserved.