将Django表单文件字段与自定义文件一起使用

2024-09-25 10:34:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为我的项目创建一个表单生成器。它根据数据库中指定的字段动态构建表单。有3个表:表单、表单字段和表单字段值。现在我尝试将数据从表单值绑定到表单字段。它运行良好,例如:

if (field.field_type == 'long_text'):
                new_field = forms.CharField(label=field.label, initial = value, required=False, widget=forms.Textarea(attrs={'class': 'form-control'}))

但这不适用于FileField:

new_field = forms.FileField(label=field.label, required = False, initial = initialData)

据我所知,“初始”数据必须采用某种格式:必须是具有url和name属性的对象

我就是这么做的:

try:
    ''' data is stored in JSON {url:'', name:''} format '''
    valueData = json.loads(value)
    initialData.initial = valueData['name']
    initialData.url = valueData['url']
    initialData.name = valueData['url']                        
except:
    pass

new_field = forms.FileField(label=field.label, required = False, initial = initialData)

表单仍然是空的。没有“清除”复选框,没有要单击的url和“未选择文件”

我能做些什么使这个文件输入工作?我需要模拟模型的文件字段吗


Tags: 文件namefalseurl表单fieldnewrequired
1条回答
网友
1楼 · 发布于 2024-09-25 10:34:28

有一个类似的问题,答案有点混乱:Django - forms.FileField() initial value

因此,为了让其他人更容易解决类似的问题,我最终提出了以下解决方案:

class DummyFile:
    def __init__(self, url, name):
        self.url = url; self.name = name
    def __str__(self):
        return self.name

(……)

valueData = json.loads(value)
initialData = DummyFile("%s%s" % (settings.MEDIA_URL,valueData['url']), valueData['name'])
new_field = forms.FileField(label=field.label, required = False, initial = initialData)

所以它基本上创建了一个新类,这个类有.url值返回实际文件的路径,还有__str__值将对象转换为文件名字符串。我使用url和名称分开,因为文件名在保存到服务器时是散列的,然后数据库存储文件的真实名称

相关问题 更多 >