Django в чем ошибка?
Столкнулся с ошибкой, что при введении в поле поиска слова и при нажатии на найти вылетает ошибка "UnboundLocalError: local variable 'page_object' referenced before assignment". Что делать?
{% extends 'food/base_main.html' %}
{% load static %}
{% block title%}Рецепты{% endblock title%}
{% block nav %}
{% if request.user.is_authenticated %}
<a href = "{% url 'main' %}"><li><button class = "nav_btn">Рецепты</button></li></a>
<li><button class = "nav_btn">Избранное</button></li>
<a href = "{% url 'create' %}"><li><button class = "nav_btn_">Создать</button></li></a>
<a href = "{% url 'profile' %}"><li class = "enter"><button class = 'enter_btn'>{{user.first_name}}</button></li></a>
<a href="{% url 'logout' %}"><li class = "reg"><button class = 'reg_btn'>Выход</button></li></a>
{% else %}
<a href = "{% url 'main' %}"><li><button class = "nav_btn">Рецепты</button></li></a>
<li><button class = "nav_btn">Избранное</button></li>
<a href = "{% url 'create' %}"><li><button class = "nav_btn_">Создать</button></li></a>
<a href = "{% url 'authentication' %}"><li class = "enter"><button class = 'enter_btn'>Вход</button></li></a>
<a href="{% url 'registration' %}"><li class = "reg"><button class = 'reg_btn'>Регистрация</button></li></a>
{% endif %}
{% endblock %}
{% block recept %}Рецепты{% endblock %}
{% block liked %}Избранные{% endblock %}
{% block crate %}Cоздать{% endblock %}
{% block search_form_ %}
<form class = "search_form" action="{% url 'main' %}">
<input class = "search_form_input" placeholder = "Найти рецепт" type = "search" name = "search" arial-label = "Найти рецепт">
<button class = "search_btn" type = "submit">Найти</button>
</form>
{% endblock %}
{% block content %}
{% for card in page_object %}
<a class = "recept_anim">
<div class = "recept">
<div class="img_recept"><img class="main_img" src="images/images//{{ card.image }}">
<div class = 'info'>
<h4 class = "product-name">{{ card.recipe_title }}</h4>
<span class = "time_text"><img src = "{% static 'images_defolt/timer_01101101.png' %}" class = "time_img">{{ card.recipe_time }} мин.</span><br>
<span class = "ingridients"><img src = "{% static 'images_defolt/food_for_card.png' %}" class = "recept_img">{{ card.recipe_ingridients }} ингридиента</span>
<a href="{% url 'product_page' card.id %}">
<div class = "card_btns">
<button class = "go_to_btn">Смотреть</button>
</div>
</a>
<span class = "author"><img src = "{% static 'images_defolt/person_logo.png' %}" class = "person_img">{{ card.user.first_name }} {{card.user.last_name}}</span>
</div>
</div>
</div>
{% endfor %}
{% endblock %}
{% block pagintion_page_to_jinja %}
{% for p in page_object.paginator.page_range %}
{% if page_object.number == p %}
<li class = "pagination">
<span href="?page={{ p }}" class = "selected_btn_pagination">{{ p }}</span>
</li>
{% elif p >= page_object.number|add:-2 and p <= page_object.number|add:2 %}
<li class = "pagination">
<a href="?page={{ p }}" class = "pages_href">{{ p }}</a>
</li>
{% endif %}
{% endfor %}
{% endblock %}
from django.shortcuts import render, redirect
from .forms import FoodForm, RegistrationForm,LoginUserForm
from .models import Recipe
from django.contrib.auth import logout
from django.contrib.auth.views import LoginView, reverse_lazy
from django.http import Http404
from django.core.paginator import Paginator
def index(request):
search_query = request.GET.get("search", "")
if search_query:
card_info = Recipe.objects.filter(recipe_title__icontains=search_query)
paginator = Paginator(card_info, 20)
else:
card_info = Recipe.objects.all()
paginator = Paginator(card_info, 20)
page_number = request.GET.get("page")
page_object = paginator.get_page(page_number)
return render(request, "food/main_jinja.html", {
"cards": card_info,
"page_object": page_object
})
def product_page(request, object_id):
try:
product = Recipe.objects.get(id=object_id)
except:
raise Http404("Рецепт не найден!")
return render(request, "food/product_page_jinja.html", {"object": product})
def create(request):
if request.method == "POST":
form = FoodForm(request.POST, request.FILES)
if form.is_valid():
recipe = form.save(commit=False)
recipe.user = request.user
recipe.save()
return render(request, 'food/true.html')
else:
return render(request, 'food/test.html')
form = FoodForm()
context = {
"form": form
}
return render(request, "food/crate.html", context)
def register(request):
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
form.save()
return render(request, 'food/succses_reg.html')
else:
return render(request, 'food/false_registration_jinja.html', {"form" : form})
form = RegistrationForm()
context = {
'form': form
}
return render(request, 'food/registration_main.html', context)
class LoginUser(LoginView):
form_class = LoginUserForm
template_name = "food/auth_page.html"
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(**kwargs)
return dict(list(context.items()))
def get_success_url(self):
return reverse_lazy("main")
def logout_from_site(request):
logout(request)
return redirect("authentication")
# return render(request, "food/auth_page.html")
def profile(request):
card_info = Recipe.objects.filter(user=request.user)
return render(request, "food/profile.html", {"cards" : card_info})
Одна из частых ошибок в том случае, когда используются условные ветвления. Причина в том, что существует состояние, когда переменной не существует.
Быстрое решение -> инициализировать переменную до ветвления (до if)
def index(request):
page_object = None
search_query = request.GET.get("search", "")
if search_query:
card_info = Recipe.objects.filter(recipe_title__icontains=search_query)
paginator = Paginator(card_info, 20)
else:
card_info = Recipe.objects.all()
paginator = Paginator(card_info, 20)
page_number = request.GET.get("page")
page_object = paginator.get_page(page_number)
return render(request, "food/main_jinja.html", {
"cards": card_info,
"page_object": page_object
})
При таком использовании, у вас переменная page_object существует во всей области видимости функции