Django 内联表单集的图像字段未更新

Rob*_*Rob 3 forms django image inline-formset

我有一个列表模型和一个照片模型:

class Listing(models.Model):
    title = models.CharField(max_length=255)
    <more fields>...

class Photo(models.Model):
    image = models.ImageField(upload_to=create_file_path)
    listing = models.ForeignKey(Listing, related_name='photos')
Run Code Online (Sandbox Code Playgroud)

我正在使用 CBV、UpdateView 来编辑列表。我正在使用这个表格:

class ListingDetailForm(forms.ModelForm):
    class Meta:
    model = Listing
    exclude = []
Run Code Online (Sandbox Code Playgroud)

以及 forms.py 中的内联表单集,可以删除/更改图像:

PhotoFormset = inlineformset_factory(Listing, Photo, fields='__all__', extra=1)
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

PhotoFormset = inlineformset_factory(Listing, Photo, fields='__all__', extra=1)
Run Code Online (Sandbox Code Playgroud)

以及相关的模板部分:

{% block body %}
<form action="" method="post">
    {% csrf_token %}
        {% for field in form %}
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}<br><br>
        {% endfor %}
        {% for field in photo_form %}
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}<br><br>
        {% endfor %}
    {{ photo_form.management_form }}
    <input type="submit" value="Update" />
</form>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是:

1)如果列表中附有照片,通过管理员,如果我对照片表单不执行任何操作(例如仅更改列表模型中的字段),则照片表单不会通过验证。无效后重新加载页面时,照片表单不会显示任何错误。

2) 选择新照片不会更改当前照片,照片表单不会验证且不会显示任何错误。

3) 如果当前没有与列表相关的照片,则尝试通过表单添加一张照片进行验证,但实际上并未保存与该列表相关的照片。

如果列表中附有图像,则删除图像就可以了。删除图像并更新列表中的其他一些字段是有效的。如果没有图像更新,则仅列表字段有效。通过表单向列表添加第二张照片不起作用,并且不会显示任何表单错误。

Ale*_*los 5

我注意到您的表格存在一些问题。

  1. 您需要在表单属性中包含enctype="multipart/form-data",否则您将无法将文件数据发布到服务器
  2. 如果您绝对需要使用手动渲染,我将使用 Django 方法来渲染表单(form.as_p、form.as_table 或 form.as_ul ),然后遵循官方指南:模型表单集
  3. 在 post 方法中,您的表单集缺少文件和实例

一旦实施这些更改,您的表单集应该可以正常工作。