Как мне разместить скрытые FileFields в шаблоне Django? - PullRequest
0 голосов
/ 22 марта 2011

Я пытаюсь разобраться с загрузкой файлов в 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 - нет.Что я могу сделать по этому поводу?

Спасибо

1 Ответ

2 голосов
/ 22 марта 2011

Я предполагаю, что входные данные файла не передаются на шаг 2, потому что элементы <input type="file"> не содержат данных и не заполняются заранее. <input type="file"> всегда пустые при загрузке.

Вы не можете делиться данными файла между обновлениями браузера, если только вы не закодируете данные в текстовый элемент формы и не расшифруете их или не сохраните в сеансе.

Это мера безопасности браузера.

Проверьте мой ответ здесь:

Повторная отправка изображения в ImageField после ошибки проверки в Django

Я бы сохранил информацию о сохраненном файле в сеансе и вытащил ее обратно на шаге 3 вашей формы.

  1. Отправить # имя файла магазина
  2. Preview
  3. Отправить # pull имя файла

Или вы можете настроить предварительный просмотр ajax или что-то подобное?

...