Я пытаюсь разобраться с загрузкой файлов в Django, и я столкнулся с проблемой.Моя цель - создать форму, которая позволит пользователям загружать текстовые и файловые данные, просматривать эти входные данные, а затем публиковать их.
Я разместил всю логику в одном представлении с несколькими шаблонами, связанными с различными кнопками отправки.Я не хотел сохранять все экземпляры, а затем создавать собственный менеджер для опубликованных сообщений.Однако, возможно, я должен сделать это.
Моя проблема в том, что мой набор форм файлов не работает должным образом.Когда я просто отправлял данные без предварительного просмотра, все было хорошо.Но однажды я начал отправлять обратно в разные шаблоны, он перестал работать.Я знаю, что вы хотите HttpResponseRedirect после POST, но я решил, что мой метод был в порядке в этом случае.Я, честно говоря, понятия не имею.
Вот моя логика представления
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))
В шаблон предварительного просмотра я включаю скрытые входные данные, которые затем отправляются обратно на страницу редактирования или публикуются.Мой photo_formset содержится в div с свойством display: none, поэтому он невидим.
Когда я отправляю POST со страницы редактирования, ввод скрытого текста проходит, а ввод FILE - нет.Что я могу сделать по этому поводу?
Спасибо