在我的网站中,我想通过分页展示葡萄酒,每页 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">« 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 »</a>
{% endif %}
</span>
</div>
这与分页无关。它只是意味着存在
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})