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

问题描述 投票:1回答:1

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

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.朋友

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

django
1个回答
1
投票

一些评论:

  • 如果您只想编辑描述,则不应将archive_file字段作为表单字段包含在内。
  • 您可以将视图中的表单实例传递给请求的上下文。然后在模板中插入文件的标题。

如果您可以提供您的视图代码,我们可以讨论实际的实现。

更新:

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

如:

# template
{% for archive_form in archive_formset %}
    {{ archive_form.instance.archive_file.filename }}
    {{ archive_form.description }}
{% endfor %}
© www.soinside.com 2019 - 2024. All rights reserved.