You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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流式返回视图,替代媒体路由的文件访问能力:

  1. 新增视图代码:
    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
    
  2. 在路由配置中添加对应路径:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.24 14:06:04