Django FilePathField 不适用于相对路径
Django FilePathField doesn't work with relative path
有一个模型Language
。语言对象通过 Django-admin
创建 Admin。他们必须从下拉菜单中选择合适的标志文件。
问题是当我部署项目时没有选择标志。
由于静态文件是在部署前收集的,我尝试设置这个路径:
flag = models.FilePathField(path='static/img/flags/550px',default='')
但是如您所见,它找不到任何东西。
如果我这样做,我可以从标志中选择:
flag = models.FilePathField(path=settings.BASE_DIR+'/static/img/flags/550px',default='')
但是仅仅调用 language.flag
是行不通的,因为它是 returns 绝对路径。
<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)
FilePathField.path
Required. The absolute filesystem path to a directory from which this >FilePathField should get its choices. Example: "/home/images".
强调我的。
当你在这里使用绝对路径时,你的模板确实会产生一个相对路径我不能告诉你那是什么,因为你在 FilePathField 中设置的路径和你声称获得的路径相互矛盾其他。但我可以向你保证,该模板将给出一个相对路径。
不确定,如果这是一个错误(可能是),但您的管理员将完整路径保存在标志对象中,而不仅仅是相对路径。所以我想使用 属性 是一种选择
@property
flag_path(self):
return self.flag.replace(settings.BASE_DIR,'')
另一种选择是覆盖管理保存模型方法以在此时进行剥离
Django 做出了一项设计决定,不提供在 FilePathField
中存储相对路径的选项(https://code.djangoproject.com/ticket/6896). Instead, @alexhayes kindly provided a RelativeFilePathField
that stores relative paths, and otherwise works the same as FilePathFIeld
: https://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 中显示和选择的选项与存储在 DB (!) 中的内容完全相同。 language.flag
returns 只是相对的部分。 Language.absflagpath
是 class attribute/variable 没有存储在 DB 中, returns 存储的相对路径是 absolute 路径关系到。请注意,flag
的默认参数是相对的。
有一个模型Language
。语言对象通过 Django-admin
创建 Admin。他们必须从下拉菜单中选择合适的标志文件。
问题是当我部署项目时没有选择标志。
由于静态文件是在部署前收集的,我尝试设置这个路径:
flag = models.FilePathField(path='static/img/flags/550px',default='')
但是如您所见,它找不到任何东西。
如果我这样做,我可以从标志中选择:
flag = models.FilePathField(path=settings.BASE_DIR+'/static/img/flags/550px',default='')
但是仅仅调用 language.flag
是行不通的,因为它是 returns 绝对路径。
<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)
FilePathField.path
Required. The absolute filesystem path to a directory from which this >FilePathField should get its choices. Example: "/home/images".
强调我的。
当你在这里使用绝对路径时,你的模板确实会产生一个相对路径我不能告诉你那是什么,因为你在 FilePathField 中设置的路径和你声称获得的路径相互矛盾其他。但我可以向你保证,该模板将给出一个相对路径。
不确定,如果这是一个错误(可能是),但您的管理员将完整路径保存在标志对象中,而不仅仅是相对路径。所以我想使用 属性 是一种选择
@property
flag_path(self):
return self.flag.replace(settings.BASE_DIR,'')
另一种选择是覆盖管理保存模型方法以在此时进行剥离
Django 做出了一项设计决定,不提供在 FilePathField
中存储相对路径的选项(https://code.djangoproject.com/ticket/6896). Instead, @alexhayes kindly provided a RelativeFilePathField
that stores relative paths, and otherwise works the same as FilePathFIeld
: https://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 中显示和选择的选项与存储在 DB (!) 中的内容完全相同。 language.flag
returns 只是相对的部分。 Language.absflagpath
是 class attribute/variable 没有存储在 DB 中, returns 存储的相对路径是 absolute 路径关系到。请注意,flag
的默认参数是相对的。