#python #django #request
Вопрос:
у меня есть
View.py
class mainView(View):
template_name = "search.html"
def error_page(self,request):
return render(request, 'error_page.html')
def getQuery(self,query,):
posts_list = Galeria.objects.filter(
Q(nazwa__icontains=query) | Q(opis__icontains=query)
).distinct()
return(posts_list)
def postPagination(self,paginator,page):
try:
posts = paginator.page(page)
except PageNotAnInteger:
posts = paginator.page(1)
except EmptyPage:
posts = paginator.page(paginator.num_pages)
return posts
def post_list(self,request, category_slug=None, **kwargs):
posts_list = Galeria.objects.all()
query = request.GET.get('q')
if query:
posts_list = self.getQuery(query)
ile = posts_list.count
paginator = Paginator(posts_list, 10) # 10 posts per page
page = request.GET.get('page')
posts = self.postPagination(paginator, page)
category = None
categories = Category.objects.all()
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
categories_ile = Galeria.objects.values('category__name').annotate(count=Count('category__name'))
context = {
'posts': posts,
'ile': ile,
'categories': categories,
'category': category,
'categories_ile': categories_ile}
return render(request, "search.html", context)
...
url.py
urlpatterns = [
path('searchbar/', mainView.post_list, name="searchbar"),
...
]
Почему я получаю ошибку «post_list() отсутствует 1 необходимый позиционный аргумент: «запрос»»?
Я все перепробовал и прочитал документацию на этой странице https://docs.djangoproject.com/en/3.2/topics/class-based-views/intro/
и все равно ничего.
Комментарии:
1. Согласно документу, который вы связали, похоже, что второй аргумент должен
path
быть результатомas_view()
вызова, а не методом экземпляра, который принимаетrequest
параметр. Как вы думаетеmainView.post_list
, что следует делать?2. Я просто пытаюсь реорганизовать свои функции в view.py в класс, и это была очень хорошая работа. Я думал, что это будут работы как в классе, так и без
Ответ №1:
Вы неправильно используете представления на основе классов. Как правило, вы реализуете методы get
, post
put
, и т.д. Для возврата HTTP-ответа, кроме того, вы должны использовать .as_view()
для обертывания представления на основе классов в функцию:
class mainView(View):
# …
# ↓ use get, not post_list
def get(self,request, category_slug=None, **kwargs):
posts_list = Galeria.objects.all()
query = request.GET.get('q')
if query:
posts_list = self.getQuery(query)
ile = posts_list.count
paginator = Paginator(posts_list, 10) # 10 posts per page
page = request.GET.get('page')
posts = self.postPagination(paginator, page)
category = None
categories = Category.objects.all()
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
categories_ile = Galeria.objects.values('category__name').annotate(count=Count('category__name'))
context = {
'posts': posts,
'ile': ile,
'categories': categories,
'category': category,
'categories_ile': categories_ile}
return render(request, "search.html", context)
и в самом urls.py
:
urlpatterns = [
# ↓ use .as_view()
path('searchbar/', mainView.as_view(), name="searchbar"),
# …
]
При этом, похоже, вы реализуете свою собственную версию ListView
[Django-doc], возможно, было бы лучше начать с a ListView
и переопределить некоторые методы, например .get_queryset(…)
, для реализации вашего представления. Это также приведет к удалению большого количества шаблонного кода, такого как разбиение на страницы и т. Д.
Комментарии:
1. Хорошо, я начинаю делать то, что ты сказал, и это начинало работать! Спасибо за помощь 🙂 Я использовал TemplateView вместо ListView.