Django FilePathField不适用于相对路径

时间:2017-01-17 12:16:20

标签: python django django-staticfiles django-media

有一个模型Language。语言对象通过Django-admin创建管理员。他们必须从下拉菜单中选择适当的标志文件。

问题是我在部署项目时没有选择标志。

由于在部署之前正在收集静态文件,因此我尝试设置此路径:

flag = models.FilePathField(path='static/img/flags/550px',default='')

但正如你所看到的,它找不到任何东西。

enter image description here

如果我这样做,我可以选择旗帜:

flag = models.FilePathField(path=settings.BASE_DIR+'/static/img/flags/550px',default='')

但是它只是调用language.flag不起作用,因为它返回绝对路径。

<img src = "{{ language.flag }}">

产生这个:

<img src="/home/django/MyProject/static/img/flags/550px/ar.png">

我想到的唯一解决方案是创建一个剥离path剪切“/ home / django / MyProject /”的属性,但我不确定这是不是一个好主意。

有更好的方法吗?

class Language(models.Model):
    shortcut = models.CharField(max_length=40,
                                help_text=_('Shortcut of the language'),
                                unique=True)

    name = models.CharField(max_length=40,
                            help_text=_('Name of the language'),
                            unique=True, verbose_name=_("Language"))

    flag = models.FilePathField(path='static/img/flags/550px',default='/static/img/icons/check-icon.png')

    def __str__(self):
        return self.name

编辑:

Admin.py:

from django.contrib import admin
from models import  Language

admin.site.register(Language)

2 个答案:

答案 0 :(得分:1)

  

FilePathField.path
  需要。 绝对文件系统路径指向此&gt; FilePathField应从中选择的目录。示例:&#34; / home / images&#34;。

强调我的。

当你在这里使用绝对路径时,你的模板确实产生了一个相对路径我无法告诉你那是什么,因为你在FilePathField中设置的路径和你声称相互矛盾的路径其他。但我可以向你保证,模板会给出相对路径。

不确定,如果它是一个错误(可能是)但你的管理员正在保存标志对象中的完整路径而不仅仅是相对路径。所以我猜使用属性是一个选项

 @property
 flag_path(self):
     return self.flag.replace(settings.BASE_DIR,'')

另一个选择是覆盖管理员保存模型方法以在那时进行剥离

答案 1 :(得分:0)

Django做出了一项设计决定,即不提供在FilePathFieldhttps://code.djangoproject.com/ticket/6896)中存储相对路径的选项。相反,@ alexhayes友善地提供了一个RelativeFilePathField存储相对路径,否则与FilePathFIeldhttps://bitbucket.org/alexhayes/django-relativefilepathfield/src/master/相同。

非常简短,您:

pip install django-relativefilepathfield

然后,您可以在模型中使用它,例如:

from relativefilepathfield.fields import RelativeFilePathField

class Language(models.Model):
    ...
    absflagpath = os.path.join(settings.BASE_DIR,'/static/img/flags/550px')
    flag = RelativeFilePathField(path=absflagpath, default='check-icon.png')

Admin的工作原理与它应该的一样,在UI中显示和选择的选项与存储在数据库(!)中的内容完全相同。 language.flag仅返回相对部分。 Language.absflagpath是一个类属性/变量,未存储在数据库中,并返回存储的相对路径相对的绝对路径。请注意,flag的默认参数是相对的。