get_absolute_url id и slug в Django - PullRequest
       119

get_absolute_url id и slug в Django

1 голос
/ 06 августа 2020

Здравствуйте, я хочу, чтобы мой URL был таким:

site.com / blog / books / details / [id] / [slug]

например: site.com / blog / books / details / 3 / blind_owl

Когда я нажимаю Название книги Не загружай мне ничего. Даже не показывает ошибки. Хочу мне показать Описание

Заранее спасибо

Модель:

class Book(TimeStampMixin):
    id = models.AutoField(primary_key=True)
    author = models.ForeignKey(to=Author, on_delete=models.PROTECT)
    book_name = models.TextField()

    def __str__(self):
        return '{}'.format(self.book_name)

class Details(TimeStampMixin):
    book = models.ForeignKey(to=Book, on_delete=models.PROTECT)
    description = models.TextField()
    slug = models.SlugField(max_length=100, null=True, blank=True)

    def get_absolute_url(self):
        return reverse('blog:book_details', args=[self.pk, self.slug])

    def __str__(self):
        return '{}'.format(self.book)

Главное URL:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('blog/', include('blog.urls')),
]

URL:

urlpatterns = [
    path('authors/', views.authors, name='authors'),
    path('books/', views.books, name='books'),
    path('books/details/<int:pk>/<slug:slug>/', views.book_details, name='book_details')

Просмотр:

def books(request):
    book = Book.objects.all()
    context = {'books': book}
    return render(request, 'Blog/books.html', context=context)

def book_details(request, pk, slug):
    details = Details.objects.filter(pk=pk, slug=slug)
    context = {'details': details}
    return render(request, 'Blog/book_details.html', context=context)

Шаблон книги:

{% for each in books %}
<a href="{{ each.get_absolute_url }}">
    Book's Name: {{ each.book_name }}
</a>
{% endfor %}

Шаблон сведений о книге:

{% for each in details %}
Description: {{ each.description }}
{% endfor %}

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

попробуйте это

class Details(TimeStampMixin):
...
  def get_absolute_url(self):
          return reverse('blog:book_details', kwargs={'id': self.id})
...

и храм

{% block content %}
    {% for obj in object_list %}
        <li>{{ forloop.counter }} - <a href="{{ obj.get_absolute_url }}">{{ obj.title }}</a></li>
        <br>
    {% endfor %}
{% endblock %}
0 голосов
/ 06 августа 2020

Я думаю, что в шаблоне книги вы должны поместить название книги внутри тега <a>. Итак,

{% for each in books %}
<a href="{{ each.get_absolute_url }}">
    Book's Name: {{ each.book_name }}
</a> <!-- ended tag here -->
{% endfor %}
...