/
gojuon
/
api_alex_math
Обзор
Документация
Войти
/
gojuon
/
api_alex_math
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
posts/views.py
95 строк
5 KB
Alexei Petrash
Сделан API для настроек блога
16 ноя 2025, 19:03
16 ноя 2025, 19:03
128ee34
Код
Авторство
О чём код?
from django.http import JsonResponse from django.shortcuts import get_object_or_404 from django.views.generic import ListView, DetailView from django.db.models import F from .models import Tag, Category, Post def post_category_list_json(request, category, start=0, records=5): if request.method == 'OPTIONS': response = JsonResponse('', status=200, safe=False) response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Headers'] = 'X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization' elif request.method == 'GET': qs = Post.objects.filter(category_post__slug=category).order_by('-created_at') total = len(qs) records = 5 if records not in (5, 10, 15) else records res = [] for q in qs[start:start + records]: res.append( {'title': q.title, 'slug': q.slug, 'intro': q.short_description, 'hits': q.hits, 'created_at': q.created_at, 'category': {'name': q.category_post.category_name, 'slug': q.category_post.slug},'tags': list(q.tags.all().annotate(name=F('tag_name')).values('name', 'slug'))}) response = JsonResponse({"total": total, 'data': res}, status=201) response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Methods'] = 'GET, OPTIONS' response['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept' return response def post_tag_list_json(request, slug, start=0, records=5): if request.method == 'OPTIONS': response = JsonResponse('', status=200, safe=False) response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Headers'] = 'X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization' elif request.method == 'GET': qs = Post.objects.filter(tags__slug=slug).order_by('-created_at') #.values('title', 'slug', 'intro', 'hits', 'created_at') total = len(qs) records = 5 if records not in (5, 10, 15) else records res = [] for q in qs[start:start + records]: res.append( {'title': q.title, 'slug': q.slug, 'intro': q.short_description, 'hits': q.hits, 'created_at': q.created_at, 'tags': list(q.tags.all().annotate(name=F('tag_name')).values('name', 'slug')), 'category': {'name': q.category_post.category_name, 'slug': q.category_post.slug}}) response = JsonResponse({"total": total, 'data': res}, status=201) response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Methods'] = 'GET, OPTIONS' response['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept' return response def post_json(request, category, slug): if request.method == 'OPTIONS': response = JsonResponse('', status=200, safe=False) response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Headers'] = 'X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization' elif request.method == 'GET': qs = Post.objects.filter(slug=slug).first() res = {} if qs: res = {'title': qs.title, 'slug': qs.slug, 'intro': qs.short_description, 'fulltext': qs.full_text, 'hits': qs.hits, 'created_at': qs.created_at, 'tags': list(qs.tags.all().annotate(name=F('tag_name')).values('name', 'slug')), 'category': {'name': qs.category_post.category_name, 'slug': qs.category_post.slug}} response = JsonResponse({ 'data': res}, status=201) response['Access-Control-Allow-Origin'] = '*' response['Access-Control-Allow-Methods'] = 'GET, OPTIONS' response['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept' return response class CategoryListView(ListView): context_object_name = 'posts' paginate_by = 5 def get_queryset(self): self.category = get_object_or_404(Category, slug=self.kwargs['category']) return Post.objects.filter(category_post=self.category) def get_context_data(self, **kwargs): context = super(CategoryListView, self).get_context_data(**kwargs) context['category'] = self.category return context class PostDetailView(DetailView): model = Post def get_context_data(self, **kwargs): post = self.get_object() Post.objects.filter(slug=post.slug).update(hits = F('hits') + 1) context = super().get_context_data(**kwargs) return context class TagDetailView(DetailView): model = Tag