177 lines
5.5 KiB
Python
177 lines
5.5 KiB
Python
from django.shortcuts import render, get_object_or_404, redirect
|
|
from django.views.generic import ListView, DetailView
|
|
from django.db.models import Q
|
|
from django.contrib.auth import authenticate, login, logout
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.contrib import messages
|
|
from django.core.paginator import Paginator
|
|
from .models import Artwork, About, Comment
|
|
from .forms import CommentForm
|
|
|
|
|
|
def index(request):
|
|
"""首页视图 - 展示所有作品"""
|
|
artworks = Artwork.objects.all().order_by('order', '-created_at')
|
|
context = {
|
|
'artworks': artworks,
|
|
'page_title': 'YITAO-REN GALLERY',
|
|
}
|
|
return render(request, 'gallery/index.html', context)
|
|
|
|
|
|
class ArtworkDetailView(DetailView):
|
|
"""作品详情页视图"""
|
|
model = Artwork
|
|
template_name = 'gallery/detail.html'
|
|
context_object_name = 'artwork'
|
|
slug_field = 'slug'
|
|
slug_url_kwarg = 'slug'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
artwork = self.object
|
|
|
|
# 增加浏览次数
|
|
artwork.increment_view_count()
|
|
|
|
# 获取评论(仅激活状态)
|
|
comments = Comment.objects.filter(
|
|
artwork=artwork,
|
|
is_active=True
|
|
).select_related('user').order_by('-created_at')
|
|
|
|
# 分页处理
|
|
paginator = Paginator(comments, 10) # 每页10条
|
|
page_number = self.request.GET.get('page')
|
|
page_obj = paginator.get_page(page_number)
|
|
|
|
context['comments'] = page_obj
|
|
context['comment_form'] = CommentForm() if self.request.user.is_authenticated else None
|
|
context['comment_count'] = comments.count()
|
|
|
|
# 获取相邻作品
|
|
artworks = Artwork.objects.all().order_by('order', '-created_at')
|
|
current_index = list(artworks).index(artwork)
|
|
|
|
# 前一个作品
|
|
if current_index > 0:
|
|
context['prev_artwork'] = artworks[current_index - 1]
|
|
else:
|
|
context['prev_artwork'] = None
|
|
|
|
# 后一个作品
|
|
if current_index < len(artworks) - 1:
|
|
context['next_artwork'] = artworks[current_index + 1]
|
|
else:
|
|
context['next_artwork'] = None
|
|
|
|
# 获取相关作品(同分类)
|
|
if artwork.category:
|
|
related_artworks = artwork.category.artwork_set.exclude(
|
|
id=artwork.id
|
|
).order_by('order', '-created_at')[:4]
|
|
context['related_artworks'] = related_artworks
|
|
else:
|
|
context['related_artworks'] = Artwork.objects.none()
|
|
|
|
context['page_title'] = f'{artwork.title} - YITAO-REN GALLERY'
|
|
return context
|
|
|
|
|
|
def about(request):
|
|
"""关于页面视图"""
|
|
about_page = About.objects.first()
|
|
context = {
|
|
'about': about_page,
|
|
'page_title': '关于 - YITAO-REN GALLERY',
|
|
}
|
|
return render(request, 'gallery/about.html', context)
|
|
|
|
|
|
def search(request):
|
|
"""搜索视图"""
|
|
query = request.GET.get('q', '')
|
|
artworks = Artwork.objects.all()
|
|
|
|
if query:
|
|
artworks = artworks.filter(
|
|
Q(title__icontains=query) |
|
|
Q(description__icontains=query) |
|
|
Q(category__name__icontains=query)
|
|
)
|
|
|
|
context = {
|
|
'artworks': artworks,
|
|
'query': query,
|
|
'page_title': f'搜索: {query} - YITAO-REN GALLERY',
|
|
}
|
|
return render(request, 'gallery/search.html', context)
|
|
|
|
|
|
def category_view(request, slug):
|
|
"""分类视图"""
|
|
from .models import Category
|
|
category = get_object_or_404(Category, slug=slug)
|
|
artworks = Artwork.objects.filter(category=category).order_by('order', '-created_at')
|
|
|
|
context = {
|
|
'category': category,
|
|
'artworks': artworks,
|
|
'page_title': f'{category.name} - YITAO-REN GALLERY',
|
|
}
|
|
return render(request, 'gallery/category.html', context)
|
|
|
|
|
|
def login_view(request):
|
|
"""处理用户登录"""
|
|
if request.method == 'POST':
|
|
username = request.POST.get('username')
|
|
password = request.POST.get('password')
|
|
user = authenticate(request, username=username, password=password)
|
|
|
|
if user is not None:
|
|
login(request, user)
|
|
messages.success(request, '登录成功!')
|
|
return redirect('index')
|
|
else:
|
|
messages.error(request, '用户名或密码错误')
|
|
|
|
return render(request, 'gallery/auth/login.html')
|
|
|
|
|
|
@login_required
|
|
def logout_view(request):
|
|
"""处理用户登出"""
|
|
logout(request)
|
|
messages.success(request, '已成功登出')
|
|
return redirect('index')
|
|
|
|
|
|
@login_required
|
|
def add_comment(request, artwork_slug):
|
|
"""添加评论到指定作品"""
|
|
artwork = get_object_or_404(Artwork, slug=artwork_slug)
|
|
|
|
if request.method == 'POST':
|
|
form = CommentForm(request.POST, request.FILES)
|
|
if form.is_valid():
|
|
comment = form.save(commit=False)
|
|
comment.artwork = artwork
|
|
comment.user = request.user
|
|
comment.save()
|
|
messages.success(request, '评论已发布')
|
|
else:
|
|
for error in form.errors.values():
|
|
messages.error(request, error)
|
|
|
|
return redirect('artwork_detail', slug=artwork_slug)
|
|
|
|
|
|
@login_required
|
|
def delete_comment(request, pk):
|
|
"""删除评论(软删除)"""
|
|
comment = get_object_or_404(Comment, pk=pk, user=request.user)
|
|
comment.is_active = False
|
|
comment.save()
|
|
messages.success(request, '评论已删除')
|
|
return redirect('artwork_detail', slug=comment.artwork.slug) |