在django admin上传文件,通过公共站点下载

时间:2012-10-29 20:00:22

标签: python django django-admin

我正在运行Django网站,我希望能够通过我的管理面板上传文件,然后让主网站的访问者能够下载它。我使用Django-nonrel,Django FileTransfers和Google App Engine运行我的网站。我相信上传功能正常,因为我能够在App Engine Blob存储中看到该文件。我似乎无法弄清楚如何在公共网站上提供指向文件的下载链接。我已粘贴以下相关课程:


我有一个名为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 个答案:

答案 0 :(得分:2)

根据文档here,GAE blob商店不支持公共下载,因此如果您使用默认后端作为公共下载网址,则返回None。所以我的猜测是e.file|public_download_url总是返回None。你可以验证一下。

然后我认为你的模板是错误的。如果您的应用名为“日历”,则您尝试访问e.views.download_handler Calendar.views.download_handler。{/ p>

我认为django-filetransfers页面上的示例容易出错,因为模板循环中使用的变量与示例应用程序的名称相同:“upload”。

如果这不能解决问题,您可以从日历应用中发布 urls.py 。如果url中没有映射,模板的Calendar.views.download_handler方法可能无法解析urlpatterns的网址。

你应该有像

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

在此文件中。

答案 1 :(得分:0)

我没有看到任何特别的东西,例如

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

应该可以使用,还是直接使用e.file.url

答案 2 :(得分:0)

我自己没有在Google App Engine上部署,但这似乎是django-filetransfers设计的目的:

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


编辑:我相信我在您发布的其他问题中已经回答了这个问题,然后:Trouble downlaoding file using Django FileTransfers

答案 3 :(得分:0)

我认为最简单的方法是编写一个视图,因为这个文件blob无法直接检索来编写一个这样的函数:

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