【问题标题】:How do I assign selected file to filepathfield如何将选定的文件分配给文件路径字段
【发布时间】:2013-12-23 08:15:28
【问题描述】:

目前我有一个带有徽标字段的大学模型。

我希望用户在编辑大学详细信息时能够在特定目录中的现有图片中选择一张图片。图片路径将保存在 logo 字段中。

在大学里

class University(models.Model):
    logo = models.FilePathField()

当我基于大学模型创建模型表单(UniversityForm)时,文件路径字段默认显示为选择框。我注意到如果我在下面输入代码

在大学表格中

class UniversityForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(UniversityForm, self).__init__(*args, **kwargs)

        self.fields['logo'] = forms.FilePathField(path=UNIVERSITY_LOGOS_DIR, match=".*\.(png|jpg)$", recursive=False)

每次我刷新页面时,所选的框都会在 logos 目录下填充图像名称,我可以选择该大学的图像。

但是当我想沿选择框显示所选图像时出现问题,似乎文件路径字段保存了图像的绝对路径,我无法从文件路径字段中检索所选图像。

我试过Django Templates - how do I output the relative path of file when using a FilePathField recursively,现在我可以检索文件名并使用下面的代码显示它

在大学表格中

 class UniversityForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(UniversityForm, self).__init__(*args, **kwargs)

        self.fields['logo'] = forms.FilePathField(path=UNIVERSITY_LOGOS_DIR, match=".*\.(png|jpg)$", recursive=False)

    def university_logo_url(self):
        return self.fields['logo'].choices[0][1]

在模板中

    {% if field.label == 'Logo' %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
            <img src="{{MEDIA_URL}}university_logos/{{ form.university_logo_url }}" alt="university_logo"/>
        </div>
    {% else %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        </div>
    {% endif %}

但毕竟我仍然无法弄清楚在FilePathfield中获取所选图像的方法,并且在选择变化时,我无法刷新图像。因此,每次服务器重新启动以前的选择时,我都无法保存路径选择的图像 会消失的。

在 django 中满足我的要求的正确方法是什么? 也许创建另一个小部件以从中选择并将结果保存在文件路径字段中?

仅供参考,我使用https://stackoverflow.com/a/1235542/2601579 获取图像

【问题讨论】:

    标签: html django django-models django-forms django-templates


    【解决方案1】:

    看起来你有两个选择:

    1. 每次更改下拉框时,使用自定义小部件和一点 jQuery 魔法将文件路径字段的完整路径重写为它的 url 表示形式。

    2. 创建一个自定义字段,将 FilePathField 的递归搜索行为与 FileField 的 StorageEngine 后端相结合。

    1 作为 1-off 将更容易做到。 2 会花费更多的精力,但如果您在多个地方需要此功能,可能会有回报

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2017-12-07
      • 2020-10-24
      相关资源
      最近更新 更多