Классы
Решение двух проблем:
1) На данный момент в views.py обрабатывается только get запросы
2) Там же избыточный код: методы *_detail почти полностью повторяют друг друга
Использование класса вместо функции
Испортировать функцию view и заменить фунции на классы
blog/views.py
from django.shortcuts import render
from django.views.generic import View
from .models import Post, Tag
def posts_list(request):
posts = Post.objects.all()
return render(request, 'blog/index.html', context={'posts': posts})
# def post_detail(request, slug):
# post = Post.objects.get(slug__iexact=slug)
# return render(request, 'blog/post_detail.html', context={'post': post})
class PostDetail(View):
def get(self, request, slug):
post = Post.objects.get(slug__iexact=slug)
return render(request, 'blog/post_detail.html', context={'post': post})
def tags_list(request):
tags = Tag.objects.all()
return render(request, 'blog/tags_list.html', context={'tags': tags})
# def tag_detail(request, slug):
# tag = Tag.objects.get(slug__iexact=slug)
# return render(request, 'blog/tag_detail.html', context={'tag': tag})
class TagDetail(View):
def get(self, request, slug):
tag = Tag.objects.get(slug__iexact=slug)
return render(request, 'blog/tag_detail.html', context={'tag': tag})
Заменить обработчики в blog/urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('', posts_list, name='posts_list_url'),
path('post/<str:slug>/', PostDetail.as_view(), name='post_detail_url'),
path('tags/', tags_list, name='tags_list_url'),
path('tag/<str:slug>/', TagDetail.as_view(), name='tag_detail_url')
]
Если ввести несуществующий адрес post/tratata, то выдаст ошибку DoesNorExist, чтобы появилась ошибка 404, нужно импортировать специальный метод и редактировать класс
blog/views.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from django.views.generic import View
from .models import Post, Tag
def posts_list(request):
posts = Post.objects.all()
return render(request, 'blog/index.html', context={'posts': posts})
class PostDetail(View):
def get(self, request, slug):
# post = Post.objects.get(slug__iexact=slug)
post = get_object_or_404(Post, slug__iexact=slug)
return render(request, 'blog/post_detail.html', context={'post': post})
def tags_list(request):
tags = Tag.objects.all()
return render(request, 'blog/tags_list.html', context={'tags': tags})
class TagDetail(View):
def get(self, request, slug):
# tag = Tag.objects.get(slug__iexact=slug)
tag = get_object_or_404(Tag, slug__iexact=slug)
return render(request, 'blog/tag_detail.html', context={'tag': tag})
Использование миксинов
Создать файл blog/utils.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from .models import *
class ObjectDetailMixin:
model = None
template = None
def get(self, request, slug):
# post = Post.objects.get(slug__iexact=slug)
obj = get_object_or_404(self.model, slug__iexact=slug)
return render(request, self.template, context={self.model.__name__.lower(): obj})
Редактировать файл blog/views.py
from django.shortcuts import render
from django.shortcuts import get_object_or_404
from django.views.generic import View
from .models import Post, Tag
from .utils import ObjectDetailMixin
def posts_list(request):
posts = Post.objects.all()
return render(request, 'blog/index.html', context={'posts': posts})
class PostDetail(ObjectDetailMixin, View):
model = Post
template = 'blog/post_detail.html'
# def get(self, request, slug):
# # post = Post.objects.get(slug__iexact=slug)
# post = get_object_or_404(Post, slug__iexact=slug)
# return render(request, 'blog/post_detail.html', context={'post': post})
def tags_list(request):
tags = Tag.objects.all()
return render(request, 'blog/tags_list.html', context={'tags': tags})
class TagDetail(ObjectDetailMixin, View):
model = Tag
template = 'blog/tag_detail.html'
# def get(self, request, slug):
# # tag = Tag.objects.get(slug__iexact=slug)
# tag = get_object_or_404(Tag, slug__iexact=slug)
# return render(request, 'blog/tag_detail.html', context={'tag': tag})
Last updated