Вложенные динамические URL из разных наборов представлений
здесь нооб в бэкенде.
У меня вопрос о вложенных URL в Django/DRF. Я хочу вложенную структуру URL, например:
.
site.com/blog/
: показывает список блогов.
site.com/blog/blog-name/
: показывает один блог с названием.
site.com/blog/blog-name/posts
: показывает список постов блога.
site.com/blog/blog-name/posts/some-blog-post
: отдельная запись в блоге.
site.com/blog/blog-name/posts/some-blog-post/tags
: список тегов.
site.com/blog/blog-name/posts/some-blog-post/tags/1
: тег с id = 1.
Я прочитал этот ответ, но он предлагает дополнительный метод в BlogViewset. Однако мне нужно вложить URL, используя два разных набора представлений. Потому что, как вы видите, это только начальные поля системы пользовательских блогов, и я хочу иметь возможность управлять ею без больших файлов.
У меня есть три модели, вот так:
class TagModel(models.Model):
tag = models.CharField(max_length=32)
def __str__(self):
return self.tag
class BlogModel(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(max_length=1000)
profession = models.CharField(max_length=100)
class Meta:
pass
def __str__(self):
return self.name
class PostModel(models.Model):
title = models.CharField(max_length=120)
content = models.TextField()
tags = models.ManyToManyField(TagModel)
blog = models.ForeignKey(BlogModel, on_delete=models.CASCADE, related_name="posts")
def __str__(self):
return self.title
Это мой набор представлений для Блогов:
from ..models.blog import BlogModel, PostModel
from ..serializers.blog import BlogSerializer
from rest_framework import viewsets
from rest_framework import mixins
from django.shortcuts import render
class BlogViewset(
mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet,
):
queryset = BlogModel.objects.all()
serializer_class = BlogSerializer
# Return all blogs in the database
def list(self, request):
blogs = BlogModel.objects.all()
context = {"blogs": blogs}
return render(request, "blog/home.html", context)
# Return single blog object
def retrieve(self, request, pk):
blog = BlogModel.objects.get(id=pk)
context = {"blog": blog}
return render(request, "blog/blog.html", context)
Набор просмотров для записи в блоге:
from ..models.blog import BlogModel, PostModel
from rest_framework import mixins
from rest_framework import viewsets
from django.shortcuts import render
class BlogPostViewSet(
mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet,
):
def list(self, request):
posts = PostModel.objects.all()
context = {"posts": posts}
return render(request, "blog/posts.html", context)
def retrieve(self, request, pk):
post = PostModel.objects.get(id=pk)
context = {"post": post}
return render(request, "blog/single.html", context)
И последнее, но не менее важное, у меня urls.py выглядит следующим образом:
from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from blog.viewsets import BlogViewset
from blog.viewsets.post import BlogPostViewSet
blog_router = routers.SimpleRouter()
blog_router.register(r"", BlogViewset, basename="blog")
urlpatterns = [
path("admin/", admin.site.urls),
path("blog/", include(blog_router.urls)),
]
Спасибо за ваши ответы.