将文件名添加到formset仅用于显示目的

时间:2018-03-05 15:28:29

标签: django

我有一个模型,其中包含许多用户上传的文件,除文件本身外,还包含描述和其他一些元信息。

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将文件名注入到动态创建的表单中。有没有办法可以忽略此验证仅用于此表单?或者是否有更简单/不同的方式来显示文件名?

1 个答案:

答案 0 :(得分:1)

一些意见:

  • 如果您想要修改说明,则archive_file字段作为表单字段包含在内。
  • 您可以将视图中的表单实例传递给请求的上下文。然后在模板中插入文件的标题。

如果您可以提供您的观看代码,我们可以讨论实际的实施。

更新:

查看模型表单的源代码,你总是可以获得表单对象的实例。为什么不尝试使用它?

如:

# template
{% for archive_form in archive_formset %}
    {{ archive_form.instance.archive_file.filename }}
    {{ archive_form.description }}
{% endfor %}