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
  <=p age_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})

Ответы (1 шт):

Автор решения: Dmitry

Одна из частых ошибок в том случае, когда используются условные ветвления. Причина в том, что существует состояние, когда переменной не существует.

Быстрое решение -> инициализировать переменную до ветвления (до 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 существует во всей области видимости функции

→ Ссылка