获取Django管理站点以显示pdf

时间:2013-07-30 18:57:23

标签: python django templates webserver django-staticfiles

首先,一点背景:我的医疗办公室有一个网络驱动器,我们存储所有患者记录。访问网络驱动器时,默认的Windows资源管理器界面无法提供足够的数据安全性。用户可以意外地重命名,移动东西,不正确地命名等等。当发生这种情况时,很难找到记录。

所以,我试图通过设计一个更安全的界面来解决这个问题。"我决定使用Python和Django,因为 - 一旦设置了数据库 - 它实际上要快得多,而且不必在办公室的每台计算机上安装应用程序就好了 - 他们只是访问内部网络页。我已经设计了后端python代码,它使数据库与网络驱动器保持同步。这并不容易,但我能够弄明白。但是,现在我必须设计前端,这样可以让用户更新数据库,而我不是一个网络程序员,所以学习高级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 %}

这只显示了对象的名称,因此我将其更改为显示该对象的实际路径的链接(更改的位在&#34; {% 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 %}

这肯定给了我一个文件的链接,但当我点击它时,没有任何反应,当我右键单击并在新标签中打开它时,它只是说&#34;关于:空白。&#34 ;我做错了什么?

更新

部分谢谢网上的一些研究,以及ppetrid的回答,我现在知道我的问题是我试图从网络服务器访问本地文件。不是网络程序员,我不知道这将是一个问题。不幸的是,我不确定解决方案是什么。

我知道Django有一个&#34;文件&#34;对象,似乎使用它是有意义的。然而,令人不安的是,看起来每个文件添加到数据库中的方式实际上都会将文件本身上传到某个位置。问题是,我们有数千个文件,大小超过60GB,基本上是重复的,不会起作用。我想要的只是一个对文件进行排序的指针,以及唯一的#34;上传&#34;当一个人点击链接并在浏览器中看到pdf时发生。这些文件本身位于DLink DNS-325 NAS设备的网络中(我可以在Django的URL中使用其IP)。我一直在通过Windows地图网络驱动器访问它们,因此它们也可以在&#34; Z:/&#34;在每个工作站上开车。有没有办法让Django只指向这些文件,以便我可以在浏览器中看到它们?

更新

我发现Django本身有一种服务方式&#34;静态&#34;这种类型的文件。当然,这不适合&#34;生产,&#34;但是我现在正用它来让事情变得有效。我已经按照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,一个&#34;没有该主键存在的对象&#34;,或者当我直接指向硬盘上的文件时我得到的无声失败。它实际上打开了一个包含正确网址的新页面,Chrome说&#34; loading&#34;在左下方(就像打开PDF时一样),但它只是永远坐在那里。它实际上从未加载过。还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

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

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