1- from django .contrib .auth .decorators import login_required
2- from django .core .paginator import Paginator
3- from django .db .models import Q
4- from django .http import HttpResponse
5- from django .shortcuts import get_object_or_404 , render
6- from django .views .decorators .csrf import csrf_exempt
7-
8- from .models import Book , Comment , Publisher
9-
10-
11- def index (request ):
12- books = (
13- Book .objects .select_related ("publisher" )
14- .prefetch_related ("author" , "tags" )
15- .order_by ("-created" )
16- )
17- publishers = Publisher .objects .all ()
18-
19- # Apply filters
20- search = request .GET .get ("search" , "" )
21- category = request .GET .get ("category" , "" )
22- publisher_id = request .GET .get ("publisher" , "" )
23- sort_by = request .GET .get ("sort" , "-created" )
24-
25- if search :
26- books = books .filter (
27- Q (title__icontains = search )
28- | Q (description__icontains = search )
29- | Q (author__first_name__icontains = search )
30- | Q (author__last_name__icontains = search )
31- ).distinct ()
32-
33- if category :
34- books = books .filter (tags__slug = category )
35-
36- if publisher_id :
37- books = books .filter (publisher_id = publisher_id )
38-
39- books = books .order_by (sort_by )
40-
41- # Pagination
42- paginator = Paginator (books , 12 )
43- page_number = request .GET .get ("page" )
44- page_obj = paginator .get_page (page_number )
45-
46- # Check if this is an HTMX request
47- if request .headers .get ("HX-Request" ):
48- return render (request , "books/partials/books_grid.html" , {"books" : page_obj })
49-
50- return render (
51- request ,
52- "books/index.html" ,
53- {
54- "books" : page_obj ,
55- "publishers" : publishers ,
56- },
57- )
58-
59-
60- def book_detail (request , book_id ):
61- book = get_object_or_404 (Book , id = book_id )
62-
63- # Check if this is an HTMX request for modal
64- if request .headers .get ("HX-Request" ):
65- return render (request , "books/detail.html" , {"book" : book })
66-
67- return render (request , "books/detail.html" , {"book" : book })
68-
69-
70- def book_search (request ):
71- search = request .GET .get ("search" , "" )
72- books = Book .objects .select_related ("publisher" ).prefetch_related ("author" , "tags" )
73-
74- if search :
75- books = books .filter (
76- Q (title__icontains = search )
77- | Q (description__icontains = search )
78- | Q (author__first_name__icontains = search )
79- | Q (author__last_name__icontains = search )
80- ).distinct ()
81-
82- books = books .order_by ("-created" )
83-
84- # Pagination
85- paginator = Paginator (books , 12 )
86- page_number = request .GET .get ("page" )
87- page_obj = paginator .get_page (page_number )
88-
89- return render (request , "books/partials/books_grid.html" , {"books" : page_obj })
90-
91-
92- def book_filter (request ):
93- books = Book .objects .select_related ("publisher" ).prefetch_related ("author" , "tags" )
94-
95- # Apply filters
96- category = request .GET .get ("category" , "" )
97- publisher_id = request .GET .get ("publisher" , "" )
98- sort_by = request .GET .get ("sort" , "-created" )
99-
100- if category :
101- books = books .filter (tags__slug = category )
102-
103- if publisher_id :
104- books = books .filter (publisher_id = publisher_id )
105-
106- books = books .order_by (sort_by )
107-
108- # Pagination
109- paginator = Paginator (books , 12 )
110- page_number = request .GET .get ("page" )
111- page_obj = paginator .get_page (page_number )
112-
113- return render (request , "books/partials/books_grid.html" , {"books" : page_obj })
114-
115-
116- @login_required
117- @csrf_exempt
118- def add_comment (request , book_id ):
119- if request .method == "POST" :
120- book = get_object_or_404 (Book , id = book_id )
121- text = request .POST .get ("text" , "" ).strip ()
122-
123- if text :
124- comment = Comment .objects .create (book = book , user = request .user , text = text )
125-
126- return render (request , "books/partials/comment.html" , {"comment" : comment })
127-
128- return HttpResponse ("" , status = 400 )
1+ # Файл больше не содержит view-функций для рендеринга HTML шаблонов.
2+ # Весь фронтенд теперь находится в папке frontend/.
3+ # API views находятся в apps/books/api/v1/views.py
0 commit comments