@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>
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы