2

私は Django Web サイトを運営しています。管理パネルからファイルをアップロードし、メイン サイトへの訪問者がそれをダウンロードできるようにしたいと考えています。Django-nonrel、Django FileTransfers、Google App Engine を使用してサイトを実行しています。App Engine Blob Storage でファイルを確認できるので、アップロード機能は正しく機能していると思います。私が理解できないように見えるのは、公開Webサイトで指定されたファイルへのダウンロードリンクを提示する方法です。関連するクラスを以下に貼り付けました。


次のモデルを持つ Calendar というアプリがあります。

class CalendarEvent (models.Model):
    start = models.DateTimeField(auto_now=False, auto_now_add=False)
    end = models.DateTimeField(auto_now=False, auto_now_add=False)
    title = models.CharField(max_length=500)
    description = models.TextField()

    file = models.FileField(upload_to='uploads/%Y/%m/%d/%H/%M/%S/')

ビューは次のとおりです。

def calendar(request):
events = CalendarEvent.objects.exclude(start__lt=datetime.datetime.now()).order_by('start')
return render_to_response('home/calendar.html',{'events': events},context_instance=RequestContext(request))

def download_handler(request, pk):
    upload = get_object_or_404(CalendarEvent, pk=pk)
    return serve_file(request, upload.file, save_as=True)

これが私の管理者です:

class calendarAdmin(admin.ModelAdmin):
    list_display = ('title','start','end')

admin.site.register(CalendarEvent, calendarAdmin)   

最後に、これが私のテンプレートの関連部分です。

    {% for e in events %}
    {% url Calendar.views.download_handler pk=e.pk as fallback_url %}
    <a href="{% firstof e.file|public_download_url fallback_url %}">Download</a>
{% endfor %}

{% firstof e.file|public_download_url fallback_url %} は空白を返すだけです。どこが間違っているのかわかりません。

4

4 に答える 4

2

ここのドキュメントによると、GAE BLOBストアはパブリックダウンロードをサポートしていないため、パブリックダウンロードURLにデフォルトのバックエンドを使用すると、Noneが返されます。だから私の推測では、e.file|public_download_url常にNoneを返します。あなたはそれを確認することができます。

それならあなたのテンプレートは間違っていると思います。アプリの名前がCalendarの場合、本来あるe.views.download_handlerべき場所にアクセスしようとしています。Calendar.views.download_handler

テンプレートループで使用される変数の名前がサンプルアプリ「upload」と同じであるため、django-filetransfersページのサンプルではエラーが発生しやすいと思います。

これで問題が解決しない場合は、カレンダーアプリからurls.pyを投稿してください。にマッピングがない場合、テンプレートのurlメソッドがURLを解決できない可能性があります。Calendar.views.download_handlerurlpatterns

あなたは次のようなものを持っている必要があります

urlpatterns = patterns('Calendar.views',
    ...
    (r'^download/(?P<pk>.+)$', 'download_handler'),
    ...
)

このファイルで。

于 2012-11-02T01:10:50.037 に答える
0

私自身はGoogleAppEngineにデプロイしていませんが、これはdjango-filetransfersが設計された目的のようです。

http://www.allbuttonspressed.com/projects/django-filetransfers#handling-downloads


編集:私はあなたが投稿した他の質問でこれに答えたと思います、そして:DjangoFileTransfersを使用したファイルのダウンロードの問題

于 2012-11-01T23:01:05.177 に答える
0

このファイルブロブを直接取得して次のような関数を作成することはできないため、最も簡単な方法はビューを作成することだと思います。

def file_transfer(req, calendar_event_id):
    try:
       ce = CalendarEvent.objects.get(calendar_event_id)
    except CalendarEvent.DoesNotExist:
       raise Http404()

    file = ce.file (Write Google appengine specfic routine to pull file)
    return HttpResponse(file, media_type='file content type')

urls.py に接続します

于 2012-11-02T13:08:00.567 に答える
0

特別なことは何も見えません。

<a href="{{ e.file.get_absolute_url }}">Download File</a>

動作するはずですか、それともe.file.url直接使用するだけですか?

于 2012-10-29T20:11:06.473 に答える