我使用一个表单上传图像, 并将其链接到使用多个多层关系的模型中。 我将表单显示在状态表下面, 这样用户就可以填充状态字段 + 添加图像, 然后单击“ 保存” 或“ 保存” 并添加另一个图像 。
最后一种情况是,它应该显示预填状态表,然后在块框内设置一个通常内容的块,以处理上传文件(一个链接到图像,一个要删除的复选框和一个上传不同图像的文件输入),最后显示一个空白文件输入,上传第二个图像。现在,我有两个空白文件输入。
窗体板知道已经上传了一张图像, 但是它没有显示管理它所需的任何东西 。 这是在窗体框中的图像字段的正常行为吗? 还是这里的图像字段的正常行为 与我提供窗体板数据的方式有问题?
这是代码:
# Models
class Image(models.Model):
image = ImageField(upload_to= uploads/status/images/ ,)
class Status(models.Model):
author = models.ForeignKey(User,)
images = models.ManyToManyField(Image, blank=True, null=True)
body = models.TextField()
# Forms
class StatusForm(forms.ModelForm):
class Meta:
model = Status
fields = [ body ,]
class ImageForm(forms.ModelForm):
class Meta:
model = Image
fields = [ image ,]
# View
@csrf_protect
def form(request, id=None, template_name= status/form.html ):
if id:
status = get_object_or_404(Status, pk=id)
images = status.images.all().values()
else:
status = Status(author=request.user)
images = None
if request.method == POST :
form = StatusForm(request.POST, instance=status)
formset = ImageFormSet(request.POST, request.FILES, initial=images)
if form.is_valid():
try:
status = form.save()
if formset.is_valid():
try:
for form in formset:
image = form.save()
status.images.add(image)
status.save()
if request.POST.get( _add_image , None):
return HttpResponseRedirect(reverse( status_edit , args=[status.id]))
else:
messages.success(request, Status saved )
return HttpResponseRedirect(request.POST.get( next , / ))
except:
messages.error(request, Technical error )
except:
messages.error(request, Technical error )
else:
form = StatusForm(instance=status)
formset = ImageFormSet(initial=images)
return render_to_response(template_name, {
form : form,
formset : formset,
next : request.GET.get( next , / ),
}, context_instance=RequestContext(request))
模板 :
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.non_field_errors }}
<input type="hidden" name="next" value="{{ next }}" />
{{ form.body }}
{{ form.body.errors }}
<hr />
{{ formset }}
<hr />
<div class="pull-right">
<input name="_add_image" class="btn" type="submit" value="Add another image">
<input name="_complete" class="btn btn-primary" type="submit" value="Save">
</div>
</form>