@dimaQd

Как заставить django понять, что мне нужен конкретный слаг конкретной записи в бд?

У меня есть модели Book и Chapter. У каждой книги есть много страниц. Если я делаю после slug модели Chapter уникальным, то в случае, когда я хочу, чтобы слаг первой страницы книги1 был 1, то выдается ошибка, что такой слаг уже есть...

То есть, я никогда не добьюсь такого:
/book1/1/
/book2/1/

не выйдет, т.к. у book1 уже есть страница 1 со слагом 1.

Если сделать поле не уникальным, то получаю ошибку, что ожидался один аргумент, а было получено 2.

Как мне добиться, чтобы джанго понимал, что слаг модели Сhapter относится к конкретной книге и не обращал внимания на слаги с идентичным номером, но привязанными к book2 / book3 и т.д.?

models.py
class Book(models.Model):
    some code

class Chapter(models.Model):
   book= models.ForeignKey(Book, verbose_name="title", on_delete=models.CASCADE)
   number = models.PositiveIntegerField(verbose_name="num chapter")
   slug = models.SlugField(verbose_name="slug_to", null=True, blank=True)

   def save(self, *args, **kwargs):
        self.slug = self.number
        super().save(*args, **kwargs)


Views.py
class Base(View):
    def get(self, request, *args, **kwargs):
        book = Book.objects.all()
        return render(request, "base.html", context={"book": book})


class BookDetail(DetailView):
    model = Book
    context_object_name = "book"
    template_name = "book_detail.html"
    slug_url_kwarg = "slug"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["chapter"] = Chapter.objects.filter(title=self.object)
        return context


class ChapterRead(DetailView):
    model = Chapter
    context_object_name = "chapter"
    template_name = "chapter_read.html"
    slug_url_kwarg = "int"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["imgs"] = ImgChapter.objects.filter(chapter=self.object)
        return context

urls.py
from django.contrib import admin
from django.urls import path
from .views import *


urlpatterns = [
    path("", Base.as_view(),name="book_list"),
    path("<str:slug>/", BookDetail.as_view(), name="book_detail"),
    path("<str:slug>/<str:int>/", ChapterRead.as_view(), name="chapter_detail")
]

base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>tf</title>
</head>
<body>

{% for i in book%}
    <a href="{{ i.slug }}"> {{i.name}}</a>
{% endfor %}


</body>
</html>

book_detail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ book.name }}
{% for i in chapter %}
<a href="{{ i.slug }}">{{ i.number }}</a>
{% endfor %}
</body>
</html>

chapter_read.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

{{ chapter.number }}

{% for i in imgs %}

    <img src="{{ i.img.url }}">

{% endfor %}

</body>
</html>
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 1
@bacon
Зачем вообще поле slug, если оно дублирует number?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 150 000 до 180 000 ₽
Appboxo Алматы
от 830 000 до 1 250 000 ₸
Verme Москва
от 120 000 ₽
28 янв. 2021, в 04:36
5000 руб./в час
28 янв. 2021, в 03:43
2000 руб./за проект
28 янв. 2021, в 02:42
120000 руб./в час