如何将所选文件分配给filepathfield

时间:2013-12-06 04:40:06

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

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

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

大学

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

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

在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)

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

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

我尝试了Django Templates - how do I output the relative path of file when using a FilePathField recursively,现在我可以使用下面的代码

来检索文件名并显示它

在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)

    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 %}

但毕竟我还是找不到在文件路径域中获取所选图像的方法,并且当选择更改时我无法刷新图像。因此,每次服务器重新启动先前的选择时,我都无法保存所选路径的路径 将会消失。

满足django要求的正确方法是什么? 也许创建另一个小部件来选择并将结果保存在filepathfield中?

仅供参考我用https://stackoverflow.com/a/1235542/2601579来获取图片

1 个答案:

答案 0 :(得分:0)

看起来你有两个选择:

  1. 每次更改下拉框时,都会使用自定义窗口小部件和一些jQuery魔法来重写filepathfield的完整路径到它的url表示。

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

  3. 1将更容易做一次性。 2将需要更多努力,但如果您需要在多个地方使用此功能,可能会获得回报