Skip to main content
 首页 » 编程设计

python之获取Django管理站点以显示pdf

2025年05月04日34qq78292959

首先,有一点背景知识:我的医疗办公室有一个网络驱动器,我们可以在其中存储所有患者记录。访问网络驱动器时,默认的Windows资源管理器界面不能提供足够的数据安全性。用户能够意外地重命名事物,移动事物,不正确地命名事物等。这种情况发生时,查找记录变得非常困难。

因此,我正在尝试通过设计“更安全”的接口来解决此问题。我之所以决定使用Python和Django,是因为-一旦建立了数据库-实际上它的速度要快得多,不必在办公室的每台计算机上都安装应用程序就很好了-他们只需访问内部网页即可。我已经设计了后端python代码,该代码可使数据库与网络驱动器保持同步。这并不容易,但是我能够弄清楚。但是,现在我必须设计前端,该前端允许用户更新数据库,而且我不是Web程序员,因此仅针对该项目学习高级html,css,jquery等的想法就令人生畏。我也非常喜欢Django Admin界面的外观。最后,它主要完成了我想做的事情-提供了一种简单的方法来查看其中的内容,并在必要时进行更改。因此,我决定尝试调整管理模板,以使它们执行我想要的操作。我遇到了很多问题,但是我决定为每个问题提出一个单独的问题,这是我现在正在研究的问题:

每条记录都是一个pdf,我正在查看InlineTab模板,并尝试使其包含本地文件系统上该pdf文件的链接。我已经显示了一个链接,但是当我单击它时,什么也没有发生。理想情况下,当我单击链接时,我希望它在页面上为该页面留出的空白处显示pdf(当前,每条记录的信息都遍及整个屏幕,我希望它只跨过一部分)并让屏幕的其余部分显示所选记录的pdf),但现在我决定让链接自行打开。

我的模特:

class Patient(models.Model): 
    """Holds all the information needed for a Patient and their records""" 
    last_name = models.CharField(max_length = 100) 
    first_name = models.CharField(max_length = 100) 
    mid_init = models.CharField(max_length = 1, blank = True) 
    dob = models.CharField(max_length = 20, blank = True) 
    path = models.CharField(max_length = 500, blank = True) 
 
class Record(models.Model): 
    "Holds all the information needed for a certain record""" 
    patient = models.ForeignKey(Patient) 
    title = models.CharField(max_length = 500) 
    created = models.CharField(max_length = 20, blank = True) 
    path = models.CharField(max_length = 200) 


我的“ admin.py”:

from django.contrib import admin 
from records.models import Patient, Record 
 
class RecordInline(admin.TabularInline): 
    model = Record 
    extra = 0 
    readonly_fields = ['path'] 
 
class PatientAdmin(admin.ModelAdmin): 
    fieldsets = [ 
        ('Patient Info',        {'fields': ['last_name', 'first_name', 'mid_init', 'dob']}), 
        ('Patient Folder',      {'fields': ['path'], 'classes': ['collapse']}), 
    ] 
    inlines = [RecordInline] 
    list_display = ('last_name', 'first_name', 'mid_init', 'dob') 
    search_fields = ('last_name', 'first_name', 'mid_init', 'dob') 
 
admin.site.register(Patient, PatientAdmin) 


您可以看到记录被列为“表格内联”,因此我跟踪了该模板(tabular.html),这似乎是该模板的相关部分:

{% if inline_admin_form.original or inline_admin_form.show_url %}<p> 
          {% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %} 
          {% if inline_admin_form.show_url %}<a href="{% url 'admin:view_on_site' inline_admin_form.original_content_type_id inline_admin_form.original.pk %}">{% trans "View on site" %}</a>{% endif %} 
            </p>{% endif %} 


这只是显示对象的名称,因此我对其进行了更改,以显示到该对象实际路径的链接(更改后的位在“ {% if inline_admin_form.original %}”部分中):

{% if inline_admin_form.original or inline_admin_form.show_url %}<p> 
          {% if inline_admin_form.original %} <a href="file:///{{ inline_admin_form.original.path }}">{{ inline_admin_form.original.path }}</a>{% endif %} 
          {% if inline_admin_form.show_url %}<a href="{% url 'admin:view_on_site' inline_admin_form.original_content_type_id inline_admin_form.original.pk %}">{% trans "View on site" %}</a>{% endif %} 
            </p>{% endif %} 


那肯定给了我指向该文件的链接,但是当我单击它时,什么也没有发生,当我右键单击并在新选项卡中打开它时,它只是显示“ about:blank”。我究竟做错了什么?

更新

部分由于在线研究以及下面ppetrid的回答,我现在知道我的问题是我正在尝试从Web服务器访问本地文件。不是网络程序员,我不知道这会是一个问题。不幸的是,我不确定解决方案是什么。

我知道Django有一个“文件”对象,使用它似乎很有意义。但是,令人不安的是,似乎每个添加到数据库的文件实际上都会将文件本身上载到特定位置。问题是,我们实际上有数千个文件,大小超过60GB,并且基本上复制不起作用。我想要的只是该文件的各种指针,并且是唯一的“上传”,当一个人单击链接并在其浏览器中看到pdf时发生。文件本身位于DLink DNS-325 NAS设备的网络中(我可以在Django中的url中使用其IP)。我一直在通过Windows Map Network Drive访问它们,因此在每个工作站的“ Z:/”驱动器下也可以使用它们。有什么方法可以让Django指向这些文件,以便在浏览器中看到它们?

更新

我发现Django本身就有一种服务这种类型的“静态”文件的方式。自然,这不适合“生产”,但是我将使用它来使事情暂时生效。我已经按照Django网站上有关投放静态文件的说明进行操作,最终在我的settings.py中完成了此操作:

STATIC_ROOT = 'C:/projects/working/' 
 
STATIC_URL = '/static/' 


现在,tabular.html模板的相应行如下所示:

{% if inline_admin_form.original %} <a href="/static/{{ inline_admin_form.original.relative_path }}" target="_blank">{{ inline_admin_form.original.relative_path }}</a>{% endif %} 


一方面,这似乎是可行的,因为它现在正在尝试打开一个正确的URL,但是无论何时这样做,它都会给我一个404错误,表明该位置实际上没有提供静态文件。因此,我的新问题是:如何使静态文件实际以正确的URL提供?

还有另一个更新

好的,我想我已经取得了突破。看起来,尽管Django可以提供静态文件,但我并未执行所有必要的步骤来实现这一目标。现在,我的settings.py看起来像这样:

STATIC_ROOT = '' 
 
# URL prefix for static files. 
# Example: "http://example.com/static/", "http://static.example.com/" 
STATIC_URL = '/static/' 
 
# Additional locations of static files 
STATICFILES_DIRS = ( 
    # Put strings here, like "/home/html/static" or "C:/www/django/static". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
    'C:/projects/working/', 
) 


我的urls.py看起来像这样:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns 
 
# Uncomment the next two lines to enable the admin: 
from django.contrib import admin 
admin.autodiscover() 
 
urlpatterns = patterns('', 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^search_results/$', views.search_results), 
) 
 
urlpatterns += staticfiles_urlpatterns() 


表格内联的模板如下所示:

{% if inline_admin_form.original %} <a href="{% static inline_admin_form.original.relative_path %}" target="_blank">{{ inline_admin_form.original.relative_path }}</a>{% endif %} 


现在,这似乎越来越接近我的需求了。我没有得到404,没有“没有具有该主键的对象”,或者当我直接指向硬盘驱动器上的文件时遇到了无提示故障。实际上,它会打开一个带有正确URL的新页面,Chrome在左下角说“正在加载”(就像打开pdf时一样),但它永远都在那里。它从不实际加载。还有其他想法吗?

请您参考如下方法:

为什么将CharField用作“ path”属性?由于它是文件,因此您应该使用FileField上载pdf,然后执行href="{{inline_admin_form.original.path.url}}"以获得有效的链接。

我还将名称从“路径”更改为“ pdf”或其他名称。现在,您尝试以这种方式尝试直接从本地文件系统加载文件,一旦部署项目,该文件将无法工作(因为该文件不会上传到服务器)。您可能还想在这里看看https://docs.djangoproject.com/en/dev/topics/files/#using-files-in-models