まず、少し背景を説明します。私の診療所には、すべての患者記録を保存するネットワーク ドライブがあります。デフォルトの Windows エクスプローラ インターフェイスでは、ネットワーク ドライブにアクセスする際のデータの安全性が十分ではありません。ユーザーは、誤って名前を変更したり、移動したり、不適切な名前を付けたりする可能性があります。これが発生すると、レコードを見つけることが非常に困難になります。
そこで、「より安全な」インターフェイスを設計することで、それを修正しようとしています。私が Python と Django を使用することに決めたのは、データベースがセットアップされると、実際にははるかに高速であり、オフィス内のすべてのコンピューターにアプリケーションをインストールする必要がなく、内部 Web ページにアクセスするだけだからです。データベースとネットワーク ドライブの同期を維持するバックエンドの Python コードは既に設計済みです。簡単ではありませんでしたが、理解することができました。ただし、ユーザーがデータベースを更新できるフロント エンドを設計する必要があります。私は Web プログラマーなので、この 1 つのプロジェクトのためだけに高度な 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 サーバーからローカル ファイルにアクセスしようとしていることが問題であることがわかりました。Web プログラマーではないので、これが問題になるとは知りませんでした。残念ながら、解決策が何であるかはわかりません。
Django には「ファイル」オブジェクトがあることは知っていますが、それを使用するのは理にかなっているようです。しかし、厄介なことに、その方法でデータベースに追加された各ファイルは、実際にはファイル自体を特定の場所にアップロードするように見えます。問題は、サイズが 60GB を超える文字通り数千のファイルがあり、基本的に複製が機能しないことです。私が欲しいのは、ファイルへのある種のポインタであり、人がリンクをクリックしてブラウザでpdfを見たときに発生する唯一の「アップロード」です。ファイル自体は、DLink DNS-325 NAS デバイス (Django 内の URL で使用できる IP) のネットワーク上にあります。Windows Map Network Drive からアクセスしているので、すべてのワークステーションの "Z:/" ドライブでも利用できます。
アップデート
Django 自体に、このタイプの「静的」ファイルを提供する方法があることがわかりました。当然、これは「本番」には適していませんが、とりあえず動作させるために使用します。静的ファイルの提供に関する Django Web サイトの指示に従いましたが、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 を開くときは常にそうです)。実際に読み込まれることはありません。他のアイデアはありますか?