Всем привет.
У меня есть модель MangaTitle и модель Chapter. У каждого тайтла может быть много глав, поэтому я в Chapter сделал unique_together, чтобы не было проблем в случае, когда у тайтла2 будет глава1 и у тайтла1 глава1. Именно так я хотел дать django понять, какая именно запись из бд мне нужна.
Так вот, я сделал путь для /title/ и все ок, в нем вывел ссылки на переход в главу /tittle/number/
и при переходе получаю ошибку Field 'number' expected a number but got 'dd', где dd это title. Если смотреть в локальных переменных, то джанго в кваргах получило title и главу, но не работает.
Путь вида <str:slug>/<int:number>, где slug - название title, а number - номер главы.
ошибка:
ValueError at /dd/1/ Field 'number' expected a number but got 'dd'.
Request Method: GET Request URL: http://127.0.0.1:8000/dd/1/ Django
Version: 3.1.4 Exception Type: ValueError Exception Value: Field
'number' expected a number but got 'dd'.
models.py
class MangaTitle(models.Model):
...........
slug = models.SlugField(unique=True, blank=True, null=True)
def save(self, *args, **kwargs):
self.slug = translit_slug(self.name)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse("book_detail", kwargs={"slug":self.slug})
# def get_absolute_url(self):
# get_manga_url(self, "product_detail")
def __str__(self):
return self.name
class Chapter(models.Model):
title = models.ForeignKey(MangaTitle, verbose_name="Тайтл", on_delete=models.CASCADE)
name = models.TextField(verbose_name="Название главы", blank=True, null=True)
number = models.PositiveIntegerField(verbose_name="Номер главы")
# id = models.AutoField(primary_key=True)
slug = models.SlugField(verbose_name="Ссылка на главу", null=True, blank=True)
chapter_zip = models.FileField(verbose_name="Архив главы", blank=True, null=True, upload_to="zipChapter/")
class Meta:
unique_together = [["title", "slug"]]
def __str__(self):
return f"{self.title} - {self.number} - {self.name}"
def save(self, *args, **kwargs):
self.slug = self.number
if self.chapter_zip:
# extract_zip_to_model(self.chapter_zip, self.title, self.number)
test(self.chapter_zip, self.title, self.number)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse("chapter_detail", kwargs={"number": self.slug})
views.py
class Base(View):
def get(self, request, *args, **kwargs):
manga = MangaTitle.objects.all()
return render(request, "base.html", context={"manga": manga})
class ChapterRead(DetailView):
model = MangaTitle
context_object_name = "manga"
template_name = "chapter.html"
slug_field = "slug"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["chapter"] = Chapter.objects.filter(title=self.object)
return context
class ChapterDetail(DetailView):
model = Chapter
context_object_name = "chapter"
template_name = "chapter_read.html"
slug_field = "number"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["imgs"] = ImgChapter.objects.filter(chapter=self.object)
return context
urls.py
extra_patterns = [
#path("<str:url>/", ChapterRead.as_view(), name="chapter-read"),
path("", ChapterDetail.as_view(), name="chapter_detail"),
]
urlpatterns = [
path("", Base.as_view(),name="book_list"),
path("<str:slug>/", ChapterRead.as_view(), name="book_detail"),
path("<str:slug>/<int:number>/", include(extra_patterns))
#path("<str:slug>/<int:number>/", ChapterDetail.as_view(), name="chapter_detail")
]
chapter.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ manga.name }}
{% for i in chapter %}
<a href="{% url "chapter_detail" i.title.slug i.number %}">{{ i.slug }}</a>
{% endfor %}
</body>
</html>