如何在Django模板中发布隐藏的文件字段?

如何在Django模板中发布隐藏的文件字段?,django,django-models,django-templates,django-forms,django-views,Django,Django Models,Django Templates,Django Forms,Django Views,我试图用Django处理上传文件的问题,但遇到了一个障碍。我的目标是创建一个表单,允许用户上传文本和文件数据,预览输入,然后发布 我将所有的逻辑放在一个视图中,其中包含多个与各种提交按钮关联的模板。我不想保存所有实例,然后为发布的帖子创建自定义管理器。然而,也许我应该这样做 我的问题是我的文件表单集工作不正常。当我刚刚提交数据时,没有预览,一切都很好。但是,一旦我开始发回不同的模板,它就停止工作了。我知道你想在一篇帖子后直接回复HttpResponseDirect,但我认为我的方法在这种情况下很

我试图用Django处理上传文件的问题,但遇到了一个障碍。我的目标是创建一个表单,允许用户上传文本和文件数据,预览输入,然后发布

我将所有的逻辑放在一个视图中,其中包含多个与各种提交按钮关联的模板。我不想保存所有实例,然后为发布的帖子创建自定义管理器。然而,也许我应该这样做

我的问题是我的文件表单集工作不正常。当我刚刚提交数据时,没有预览,一切都很好。但是,一旦我开始发回不同的模板,它就停止工作了。我知道你想在一篇帖子后直接回复HttpResponseDirect,但我认为我的方法在这种情况下很好。我真的不知道

这是我的观点逻辑

def post(request):
    page="post"
#check if user has already posted and if so, direct them to their account post history page
try:
    user=User.objects.get(pk=request.user.id)
except User.DoesNotExist:   
    user=''
if user:
    try:
        post=user.post_set.all()[0]
        return HttpResponseRedirect("/profile/post/")

    #Here a user who has not posted is shown a form to do so
    except IndexError:
        postform=PostForm(prefix="post")
        PhotoFormSet=modelformset_factory(Post_Photo,exclude=('post',), extra=4, max_num=4)
        photo_formset=PhotoFormSet(queryset=Post_Photo.objects.filter(post__lt=0),prefix="photos")  #lt 0 is a hack to return an empty query set, so that other photos aren't returned with the form

#Here an anonymous user sees the form, though they can't successfully submit
else:
    postform=PostForm(prefix="post")
    PhotoFormSet=modelformset_factory(Post_Photo,exclude=('post',), extra=4, max_num=4)
    photo_formset=PhotoFormSet(queryset=Post_Photo.objects.filter(post__lt=0),prefix="photos")


if request.method=='POST' and user and request.POST.get('preview'):     
    photo_formset=PhotoFormSet(request.POST, request.FILES, prefix="photos")
    postform=PostForm(request.POST,prefix="post")
    if postform.is_valid() and photo_formset.is_valid():
        post=postform.save(commit=False)
        photos=photo_formset.save(commit=False)
        return render_to_response('website/preview_post.html', {'page':page,'post':post,'photos':photos,'photo_formset':photo_formset}, context_instance=RequestContext(request))
    else:
        return HttpResponse('error test')


if request.method=='POST' and user and request.POST.get('edit'):
    photo_formset=PhotoFormSet(request.POST, request.FILES, prefix="photos")
    postform=PostForm(request.POST,prefix="post")
    neighborhood=request.POST.get('post-neighborhood','')
    if postform.is_valid() and photo_formset.is_valid():
        return render_to_response('website/post_upload.html', {'page':page, 'neighborhood':neighborhood,'postform':postform, 'photo_formset':photo_formset}, context_instance=RequestContext(request))
    else:
        return HttpResponse(postform.errors)


if request.method=='POST' and user and request.POST.get('publish'):     
    photo_formset=PhotoFormSet(request.POST, request.FILES, prefix="photos")
    postform=PostForm(request.POST,prefix="post")
    if postform.is_valid() and photo_formset.is_valid():
        post=postform.save(commit=False)
        post.user=user
        post.save()
        photos=photo_formset.save(commit=False)
        for photo in photos:
            photo.post=post
            photo.save()
        return HttpResponse('/post_upload/?success=1')
    else:
        return HttpResponse('%s' %postform.errors)
return render_to_response("website/post_upload.html", {'page':page,'postform':postform,'photo_formset':photo_formset}, context_instance=RequestContext(request))        
在预览模板中,我包含隐藏的输入,然后将其发布回编辑页面或发布。我的照片表单集包含在一个带有display:none属性的div中,因此它是不可见的

当我从编辑页面发帖时,隐藏的文本输入会通过,但文件输入不会。我能做些什么


谢谢

我的猜测是文件输入没有被传递到步骤2中,因为
元素不包含数据,也不会被预填充<代码>在加载时始终为空

您不能在浏览器刷新之间共享文件数据,除非您将数据编码到表单文本元素中并对其进行解码或将其存储在会话中

这是一种浏览器安全措施

在这里检查我的答案:

我会将保存的文件信息存储在会话中,并在表单的第3步中将其取出

  • 提交#存储文件名
  • 预演
  • 提交#拉取文件名

  • 或者,您可以设置ajax预览之类的?

    是的,我假设表单实例会自动填充文件输入。注意这一点很有帮助。因此,如果我想显示图像的预览,我将不得不暂时保存它,对吗?我想不会——首先保存它,然后再将其拉出来,将其存储为一大块文本,或者使用ajax预览。我喜欢ajax方法!