我有一个模型,其中包含许多用户上传的文件,除文件本身外,还包含描述和其他一些元信息。
class ArchiveFile(models.Model):
archive_file = models.FileField(upload_to=grab_archive_folder, default=None, blank=False)
description = models.CharField(max_length=255)
我想要的是让用户(1)上传新文件。并且(2)能够编辑与用户相关的所有文件的描述,包括最近上传的文件。新文件的上传是通过AJAX / JQuery完成的,新的表单(作为表单集的一部分)是动态生成的。
为了能够以有效的方式编辑描述,有助于用户知道它正在改变描述的文件,因此我希望显示文件名。
我的初步解决方案如下:
forms.py
class ArchiveDataForm(ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['archive_file'].widget.attrs['disabled'] = True
class Meta:
model = ArchiveFile
fields = ['archive_file','description']
视图
def archive_data_update(request):
if request.method == 'GET':
ArchiveDataFormSet=modelformset_factory(ArchiveFile, form=ArchiveDataForm, extra=0)
archive_formset = ArchiveDataFormSet(queryset=ArchiveFile.objects.filter(user_id=request.user.id)
template = 'archive_data_edit.html'
template_context = {
'archive_formset': archive_formset,
...
}
return render(request, template, template_context)
if request.method == 'POST':
ArchiveDataFormSet=modelformset_factory(ArchiveFile, form=ArchiveDataForm, extra=0)
archive_formset = ArchiveDataFormSet(request.POST, queryset=ArchiveFile.objects.filter(user_id=request.user.id)
if archive_formset.is_valid():
for archive_form in archive_formset:
archive_form.save()
return HttpRespone('ok')
模板
{% for archive_form in archive_formset %}
{{ archive_form.archive_file.value }}
{{ archive_form.description }}
{% endfor %}
我的问题是我在动态创建的表单上遇到验证错误,说没有文件存在。我认为这是正确的,因为我所做的就是通过我的AJAX / JQuery将文件名注入到动态创建的表单中。有没有办法可以忽略此验证仅用于此表单?或者是否有更简单/不同的方式来显示文件名?
答案 0 :(得分:1)
一些意见:
archive_file
字段作为表单字段包含在内。如果您可以提供您的观看代码,我们可以讨论实际的实施。
更新:
查看模型表单的源代码,你总是可以获得表单对象的实例。为什么不尝试使用它?
如:
# template
{% for archive_form in archive_formset %}
{{ archive_form.instance.archive_file.filename }}
{{ archive_form.description }}
{% endfor %}