Django inline-formset,图像字段不更新

时间:2015-09-09 14:40:58

标签: django image forms 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')

我正在使用CBV UpdateView来编辑列表。我正在使用这种形式:

class ListingDetailForm(forms.ModelForm):
    class Meta:
    model = Listing
    exclude = []

和forms.py中的内联formset可以删除/更改图像:

PhotoFormset = inlineformset_factory(Listing, Photo, fields='__all__', extra=1)

这是我的观点:

class ListingDetailView(UpdateView):
    model = Listing
    template_name = 'listing/listing_detail.html'
    form_class = ListingDetailForm
    success_url = '/store/'

    def get_context_data(self, **kwargs):
        self.object = self.get_object()
        context = super(ListingDetailView, self).get_context_data(**kwargs)
        if self.request.POST:
            context['form'] = ListingDetailForm(self.request.POST, instance=self.object)
            context['photo_form'] = PhotoFormset(self.request.POST, self.request.FILES, instance=self.object)
        else:
            context['form'] = ListingDetailForm(instance=self.object)
            context['photo_form'] = PhotoFormset(instance=self.object)
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        photo_form = PhotoFormset(self.request.POST)
        print photo_form.is_valid()
        if form.is_valid() and photo_form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def form_valid(self, form):
        print 'in form valid for update'
        context = self.get_context_data()
        base_form = context['form']
        photo_form = context['photo_form']
        # print base_form
        # print photo_form
        if base_form.is_valid() and photo_form.is_valid():
            print 'forms are valid for update'
            base_form.save()
            photo_form.save()
            return super(ListingDetailView, self).form_valid(form)
        else:
            return self.render_to_response(self)

以及相关的模板部分:

{% 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 %}

我遇到的问题是:

1)如果列表中附有照片,通过管理员,如果我对照片表格不采取任何措施,则照片表格不会通过验证,例如:仅更改列表模型中的字段。当页面在无效后重新加载时,照片表单不会显示错误。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. 您需要在表单属性中包含 enctype =&#34; multipart / form-data&#34; ,否则您将无法将文件数据发布到服务器< / LI>
  2. 如果您绝对需要使用手动渲染,我会使用Django方法渲染表单( form.as_p,form.as_table或form.as_ul ),然后按照官方指南进行操作:{{3 }}
  3. 在post方法上,您的formset缺少FILES和实例
  4. 实施这些更改后,您的formset应该可以正常工作。