有一个模型Language
。语言对象通过Django-admin
创建管理员。他们必须从下拉菜单中选择适当的标志文件。
问题是我在部署项目时没有选择标志。
由于在部署之前正在收集静态文件,因此我尝试设置此路径:
flag = models.FilePathField(path='static/img/flags/550px',default='')
但正如你所看到的,它找不到任何东西。
如果我这样做,我可以选择旗帜:
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)
答案 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做出了一项设计决定,即不提供在FilePathField
(https://code.djangoproject.com/ticket/6896)中存储相对路径的选项。相反,@ alexhayes友善地提供了一个RelativeFilePathField
存储相对路径,否则与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中显示和选择的选项与存储在数据库(!)中的内容完全相同。 language.flag
仅返回相对部分。 Language.absflagpath
是一个类属性/变量,未存储在数据库中,并返回存储的相对路径相对的绝对路径。请注意,flag
的默认参数是相对的。