Django: загрузка фото и документа Word в одной форме не работает правильно - PullRequest
1 голос
/ 25 января 2011

У меня есть форма загрузки, которая позволит пользователю загружать фотографию, документ Word или и то, и другое. Мне нужна помощь с логикой, чтобы, пока у них есть фотография ИЛИ документ, выбранный для загрузки, форма действительна и загрузка будет работать. Он всегда работает, когда у меня есть ОБА фото и документ, но работает случайным образом, когда это просто фото или документ. Вот мой текущий код:

def upload(request):
"""
Uploads document/photo

"""

if request.method == 'POST':

    form1 = DocumentForm(request.POST, request.FILES)
    form2 = PhotoForm(request.POST, request.FILES)
    if form1.is_valid() and form2.is_valid() :
        post1 = Document(user = request.user, document= form1.cleaned_data['document'], title = form1.cleaned_data['title'])
        post1.save()
        post2 = Photo(user = request.user, alias = request.user.username, img = form2.cleaned_data['img'], title = "")
        post2.save()
        return HttpResponse(template.Template('''
                    <html><head><title>Uploaded</title></head> <body>
                    <h1>Uploaded</h1>
                    </body></html>
                    '''
                    ).render( template.Context({}))
                )

    elif form1.is_valid():
            post1 = Document(user = request.user, document = form1.cleaned_data['document'], title = form1.cleaned_data['title'])
            post1.save()

            return HttpResponse(template.Template('''
                        <html><head><title>Uploaded</title></head> <body>
                        <h1>Uploaded</h1>
                        </body></html>
                        '''
                        ).render( template.Context({}))
                    )

    else:
        if form2.is_valid():
            post2 = Photo(user = request.user, alias = request.user.username, img = form2.cleaned_data['img'], title = "")
            post2.save()
            return HttpResponse(template.Template('''
                    <html><head><title>Uploaded</title></head> <body>
                    <h1>Uploaded</h1>
                    </body></html>
                    '''
                    ).render( template.Context({}))
                )


else:  
    form1 = DocumentForm() 
    form2 = PhotoForm()
return render_to_response('upload.html', {'form1': form1, 'form2':form2 }, context_instance=RequestContext(request))

Я знаю, что должен быть лучший способ. Любая помощь будет принята с благодарностью. Спасибо

1 Ответ

0 голосов
/ 21 февраля 2011

Вам действительно нужно иметь две разные формы? Кажется, вы можете просто захотеть одну форму с двумя полями файла.

if request.method == 'POST':

    form = DocumentAndPhotoForm(request.POST, request.FILES)
    if form.is_valid():
        if form.cleaned_data.get('document'):

            post1 = Document(user = request.user, document= form1.cleaned_data['document'], title = form1.cleaned_data['title'])
            post1.save()

        if form.cleaned_data.get('img'):
            post2 = Photo(user = request.user, alias = request.user.username, img = form2.cleaned_data['img'], title = "")
            post2.save()


        return HttpResponse(template.Template('''
                <html><head><title>Uploaded</title></head> <body>
                <h1>Uploaded</h1>
                </body></html>
                '''
                ).render( template.Context({}))
            )

return render_to_response('upload.html', {'form': form },      context_instance=RequestContext(request))

В ваших файловых полях DocumentAndPhotoForm должны быть указаны параметры null=True и blank=True.

...