2

有一个模型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

编辑:

管理员.py:

from django.contrib import admin
from models import  Language

admin.site.register(Language)
4

2 回答 2

2

FilePathField.path
必需。>FilePathField 应该从中获得选择的目录的绝对文件系统路径。示例:“/home/images”。

强调我的。

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

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

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

另一种选择是覆盖管理员保存模型方法以在该点进行剥离

于 2017-01-17T12:31:51.553 回答
0

Django 做出了一个设计决定,不提供在FilePathField( https://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')

管理员按其应有的方式工作,在 UI 中显示和选择的选项与存储在数据库中的选项完全相同(!)。language.flag只返回相对部分。Language.absflagpath是一个未存储在数据库中的类属性/变量,并返回存储的相对路径相对于的绝对路径。请注意,默认参数flag是相对的。

于 2020-01-09T11:12:50.343 回答