Django - 分页不适用于最后一页

问题描述 投票:0回答:1

在我的网站中,我想通过分页展示葡萄酒,每页 9 页(假设我们有 22 种葡萄酒)。葡萄酒存储在管理界面中,每种葡萄酒都有名称、类型、描述和用于上传各自图像的 ImageField 等字段。但是,当我单击第三(最后)页时,将显示以下页面:


/页面名称/处的值错误 “图像”属性没有与其关联的文件。 请求方式:GET 请求网址:http://localhost/page-name/?page=3 Django 版本:5.0.4 异常类型:值错误 异常值:
“图像”属性没有与其关联的文件。 异常位置:[path].venv\Lib\site-packages\django\db\models ields iles.py,第 41 行,在 _require_file 中 期间引发:[app-name].views.wines_page_red


在控制台中,我收到此警告: 类型错误:“ImageFieldFile”对象不可订阅

..还有一堆例外。我是 Django 新手,我不明白什么会导致问题,因为各个项目的所有图像都已上传。在某处读到我用于分页的方法可能不稳定,所以我尝试按葡萄酒的名称排序,现在第二页出现了相同的错误。这是视图、url 部分和模板:

查看:

def wines_page_red(request):
    red_wines_list = Wine.objects.filter(type='Red')
    paginator = Paginator(red_wines_list, 9)

    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)

    return render(request, 'red-wines.html', {'page_obj': page_obj})

项目级url部分:

urlpatterns = [

    path('admin/', admin.site.urls),
    path('', include('[app-name].urls')),

] + static(django.conf.settings.MEDIA_URL, document_root=django.conf.settings.MEDIA_ROOT)

设置部分:

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

# URL that handles the media served from MEDIA_ROOT, used for managing stored files.

MEDIA_URL = '/media/'

MEDIA_ROOT = BASE_DIR / ''

模板:

   <section class="products section-padding">
        <div class="container">
            <div class="row">
                {% for wine in page_obj %}
                <div class="col-lg-4 col-12 mb-3">
                    <div class="product-thumb">
                        <a href="product-detail.html">
                            <img src="{{ MEDIA_URL }}{{ wine.image.url }}" class="img-fluid product-image" alt="">
                        </a>

                        <div class="product-info d-flex">
                            <div>
                                <h5 class="product-title mb-0">
                                    <a href="product-detail.html" class="product-title-link">{{ wine.name }}</a>
                                </h5>

                            <p class="product-p">{{ wine.description }}</p>
                        </div>
                    </div>
                </div>
            </div>
            {% endfor %}
        </div>
    </div>
</section>

<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ page_obj.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>
python django pagination
1个回答
0
投票

这与分页无关。它只是意味着存在

Wine
对象,其中图像不引用(现有)图像文件。

您可以先检查图像是否不是

None
:

{% if wine.image %}
  <a href="product-detail.html">
    <img src="{{ wine.image.url }}" class="img-fluid product-image" alt="image of the wine">
  </a>
{% endif %}

当然,您还应该确保内容引用真实文件,否则我们在提供媒体文件时会收到 404。

通常您不需要模板中的

MEDIA_ROOT
:如果配置正确,
.url
通常会添加媒体前缀本身。

您还可以过滤掉没有图像的

Wine

def wines_page_red(request):
    red_wines_list = Wine.objects.filter(type='Red', image__isnull=False)
    paginator = Paginator(red_wines_list, 9)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'red-wines.html', {'page_obj': page_obj})
© www.soinside.com 2019 - 2024. All rights reserved.