在Django中如何使用HTML从数据库获取多个PDF并在网页展示
Django实现网页端多PDF展示的落地步骤
前置基础配置
- 确认项目
settings.py中媒体文件相关配置正确:MEDIA_URL = '/media/' MEDIA_ROOT = BASE_DIR / 'media' - 在项目根路由
urls.py中添加开发环境下的媒体文件访问规则:from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # 项目原有业务路由 ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
视图逻辑修正与补全
原有PdfView存在缩进语法错误,同时未对接搜索表单的POST处理逻辑,修正后的代码如下:
from django.shortcuts import render from .models import EbookModel from .forms import SearchForm def PdfView(request): ebook_qs = EbookModel.objects.all() form = SearchForm() # 对接已集成的搜索表单逻辑 if request.method == 'POST': form = SearchForm(request.POST) if form.is_valid(): keyword = form.cleaned_data['你的搜索关键词字段名'] ebook_qs = ebook_qs.filter(title__icontains=keyword) context = { 'pdf_list': ebook_qs, 'form': form, } return render(request, '对应模板路径.html', context)
如果项目采用「PDF二进制数据直接存储在数据库字段」的方案,需要额外新增PDF流式返回视图,替代媒体路由的文件访问能力:
- 新增视图代码:
from django.http import HttpResponse, Http404 from .models import EbookModel def inline_pdf_view(request, ebook_id): try: ebook = EbookModel.objects.get(id=ebook_id) except EbookModel.DoesNotExist: raise Http404("PDF资源不存在") # 设置响应头让浏览器内嵌展示而非强制下载 response = HttpResponse(ebook.pdf_binary_content, content_type='application/pdf') response['Content-Disposition'] = f'inline; filename="{ebook.title}.pdf"' return response - 在路由配置中添加对应路径:
urlpatterns = [ path('pdf/<int:ebook_id>/show/', inline_pdf_view, name='inline_pdf'), ]
模板层功能补全
替换原有空跳转的a标签,根据实际存储方案选择对应的链接逻辑,支持两种展示模式:
模式1:点击标题跳转新标签页,调用浏览器原生PDF预览
{% extends 'basic.html' %} {% block content %} {% for item in pdf_list %} {# 本地文件存储场景:直接取FileField的url属性 #} <a href="{{ item.pdf_file.url }}" target="_blank">{{ item.title }}</a> {# 数据库存二进制场景:反向路由到自定义视图 #} {# <a href="{% url 'inline_pdf' item.id %}" target="_blank">{{ item.title }}</a> #} <br> {% endfor %} {# 保留原有搜索表单 #} <form method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit"> </form> {% endblock %}模式2:当前页面直接内嵌展示PDF内容
可使用<embed>标签实现页面内无跳转预览:{% for item in pdf_list %} <h4>{{ item.title }}</h4> <embed src="{{ item.pdf_file.url }}" width="100%" height="600" type="application/pdf"> {% endfor %}
常见问题说明
- 若PDF访问404,优先检查媒体路由配置、文件实际存储路径和
MEDIA_ROOT配置是否匹配 - 若访问PDF时直接触发下载而非内嵌展示,检查响应头
Content-Disposition的值是否为inline,不要设置为attachment - 生产环境部署时,媒体文件的静态访问不要依赖Django自带的路由能力,需交由Nginx等Web服务器处理,避免性能损耗
内容的提问来源于stack exchange,提问作者5003 Ajay muthukumaran
相关产品推荐
相关产品推荐

