我有一个列表模型和一个照片模型:
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)如果当前没有与该列表相关的照片,试图通过表单添加一个验证,但实际上并未保存与该列表相关的照片。
删除图片,如果图片附有图片,则可以正常使用。删除图像并更新列表中的其他字段。如果没有图像更新,则只有列表字段有效。通过表单向列表中添加第二张照片不起作用,并且不显示任何表单错误。
答案 0 :(得分:2)
我注意到您的表单存在一些问题。
实施这些更改后,您的formset应该可以正常工作。