html - Django image isn't uploaded by using javascript node from markup string -
i created django dynamic forms work on click, don't why image isn't uploaded.
i didn't have request.files , added that. added enctype="multipart/form-data" didn't too.
so template code:
{% load staticfiles %} <link rel="stylesheet" type="text/css" href="{% static 'vote/style.css' %}" /> <fieldset id="fieldset"> <form method = 'post' action = '' enctype="multipart/form-data">{%csrf_token %} <p>{{ votetypeform }}</p> <div id="placeholder"> </div> <p> <button type="button" name="submit" onclick="add();">+</button> </p> <input type = 'submit' value="create"/> </form> </fieldset> <script type='text/javascript'> {# document.write(code);#} var _counter = 0; var template = document.createtextnode(''); function appendstringasnodes(element, html) { var frag = document.createdocumentfragment(), tmp = document.createelement('body'), child; tmp.innerhtml = html; // append elements in loop documentfragment, browser // not re-render document each node while (child = tmp.firstchild) { frag.appendchild(child); } element.appendchild(frag); // now, append elements @ once frag = tmp = null; } function add() { var code = '<div id="template">' + '<p>' + '<fieldset id="fieldsets">' + '<legend id="legends">candidate no ['+ string(_counter+1) +']</legend>' + ' <form method = "post" action = "" enctype="multipart/form-data">'+ '<input type="hidden" name="csrfmiddlewaretoken" value="{{csrf_token }}" />' + '<p><label for="id_name">name:</label> <input id="id_name" maxlength="50" name="name" type="text" /></p>'+ '<p><label for="id_image">image:</label> <input id="id_image" name="image" type="file"/></p>'+ '</form>' + ' </fieldset>' + '</p>' '</div>'; _counter++; appendstringasnodes(document.getelementbyid("placeholder"),code); document.getelementbyid("someinput").value = _counter; } </script>
this views.py code:
def voting(request,pk): voting_num = votetype.objects.get(pk=pk).vote_set.count() if voting_num >= 2: voted1 = votetype.objects.get(pk=pk).vote_set.order_by('?').first() voted2 = votetype.objects.get(pk=pk).vote_set.order_by('?')[2] while voted1 == voted2: voted2 = vote.objects.order_by('?')[2] context = requestcontext(request, { 'voted1': voted1, 'voted2': voted2, 'voting_num': voting_num }) else: context = requestcontext(request, { 'voting_num': voting_num }) return render(request, 'vote/voting.html', context)
i write
print votetypeform.is_valid() print voteform.is_valid() = request.files.get('image') print request.files print
the printed data is:
true false <multivaluedict: {}> none
why isn't file uploaded?
i checked , added image upload code in html instead of putting in javascript code. when so, working perfectly, when try put in javascript 'code' variable , use in appendstringnodes, doesn't work. problem should in javascript. how can fix it?
as @schillingt answered in comments. problem in having in javascript code. after taking away. problem solved.
this code:
{% load staticfiles %} <link rel="stylesheet" type="text/css" href="{% static 'vote/style.css' %}" /> <fieldset id="fieldset"> <form method = 'post' action = '' enctype="multipart/form-data">{%csrf_token %} <p>{{ votetypeform }}</p> <div id="placeholder"> {# <p><label for="id_image">image:</label> <input id="id_image" name="image" type="file"/></p>#} </div> <p> <button type="button" name="submit" onclick="add();">+</button> </p> <input type = 'submit' value="create"/> </form> </fieldset> <script type='text/javascript'> {# document.write(code);#} var _counter = 0; var template = document.createtextnode(''); function appendstringasnodes(element, html) { var frag = document.createdocumentfragment(), tmp = document.createelement('body'), child; tmp.innerhtml = html; // append elements in loop documentfragment, browser // not re-render document each node while (child = tmp.firstchild) { frag.appendchild(child); } element.appendchild(frag); // now, append elements @ once frag = tmp = null; } function add() { var code = '<div id="template">' + '<p>' + '<fieldset id="fieldsets">' + '<legend id="legends">candidate no ['+ string(_counter+1) +']</legend>' + {# ' <form method = "post" action = "" enctype="multipart/form-data">'+#} '<input type="hidden" name="csrfmiddlewaretoken" value="{{csrf_token }}" />' + '<p><label for="id_name">name:</label> <input id="id_name" maxlength="50" name="name" type="text" /></p>'+ '<p><label for="id_image">image:</label> <input id="id_image" name="image" type="file"/></p>'+ {# '</form>' +#} ' </fieldset>' + '</p>' '</div>'; _counter++; appendstringasnodes(document.getelementbyid("placeholder"),code); document.getelementbyid("someinput").value = _counter; } </script>
thx @schillingt
Comments
Post a Comment