Admin FileField当前url不正确

时间:2013-09-05 09:26:06

标签: python django django-admin filefield

在Django管理员中,无论我有FileField,编辑页面上都有一个“当前”框,其中包含指向当前文件的超链接。但是,此链接附加到当前页面URL,因此导致404,因为没有这样的页面,例如: http://127.0.0.1:8000/admin/Tank/asset/17/media/datasheet/13/09/05/copyright.html/
作为参考,该文件的正确URL是: http://127.0.0.1:8000/media/datasheet/13/09/05/copyright.html

有没有办法在默认的管理布局中修复此问题?它会影响我数据库中的每个FileField,在我看来就像一个bug。我只是错了吗?

2 个答案:

答案 0 :(得分:7)

settings.py

添加以下行:

import os
BASE_DIR = os.path.realpath(os.path.dirname(__file__))

替换行:

MEDIA_ROOT = ''
MEDIA_URL = ''

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,os.pardir,'media')

这应该设置项目以从文件夹/项目目录/ media /

呈现媒体内容

urls.py

还添加以下行:

import settings

在网址模式中添加以下行:

url(r'^media/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT, 'show_indexes': False}),

models.py

在模型中添加以下行:

File = models.FileField('File',upload_to='./')

在模型中定义方法

def fileLink(self):
    if self.File:
        return '<a href="' + str(self.File.url) + '">' + 'NameOfFileGoesHere' + '</a>'
    else:
        return '<a href="''"></a>'
fileLink.allow_tags = True
fileLink.short_description = "File Link"

admin.py

使用字段fileLink作为只读字段,您也可以将其添加到list_display

例如

class FileAdmin(admin.ModelAdmin):
    list_display = ['fileLink']
    readonly_fields = ['fileLink']

答案 1 :(得分:0)

this answer完全涵盖了这个问题的答案。但简而言之,问题是你可能没有在settings.py和urls.py中设置MEDIA_ROOT和MEDIA,你还没有设置它以便提供媒体文件夹。

有关如何执行这些操作的详细信息,请查看Akseli Palen令人难以置信的精彩答案。