Thank you for your very good suggestions. Here is what i tried: Putting the script into my print_countries view worked good. The only Thing that bothered me was that i had to click the submit Button twice. The Problems i had using your alternative solution are best explained in my attachment. Thanks again! Karl
The problem is that web2py.js automatically disables the submit buttons on > forms after clicking, but it does not re-enable them unless the form is > submitted via Ajax (under the assumption that a non-Ajax form submission > will result in a new page being loaded in the browser, making it > unnecessary to re-enable the button on the original page). This breaks down > in your case because the form submission results in a file attachment being > returned to the browser rather than a new page loading -- so the original > page remains in the browser window. > > We should probably come up with a way to accommodate this case, but for > now, you can add some JS code to immediately re-enable the button yourself. > In the view, add something like: > > <script> > jQuery(function() { > jQuery(document).on('submit', 'form', function() { > var submit_button = $(this).find(jQuery.web2py.formInputClickSelector > ); > jQuery.web2py.enableElement(submit_button); > }); > }) > </script> > > Alternatively, you can put the form in a web2py component (i.e., LOAD(..., > ajax=True)), which will cause the form to be submitted via Ajax. You can > then return the file via a separate action, which can be called via > Javascript after the form is submitted: > > def print_countries(): > ... > if form.process().accepted: > response.js = 'window.location = "%s";' % URL('default', 'get_pdf' > ) > return dict(form=form) > > Then move all the PDF creation code to the get_pdf function. In this case, > print_countries would be used as an Ajax component within a containing > page. When the form is submitted, response.js will be returned to the > browser where it will be executed, resulting in the file being downloaded. > > Anthony > > On Saturday, November 7, 2015 at 3:45:07 AM UTC-5, Karl Florian wrote: >> >> Hi, >> maybe some Pictures can demonstrate what i mean.The source code is also >> attached: >> This excample is of my Countries Report. >> >> >> >> <https://lh3.googleusercontent.com/-3qSbBrXf50Y/Vj22n9l93iI/AAAAAAAAAAw/siaI3TBfrNA/s1600/CountriesReport1.jpg> >> >> >> <https://lh3.googleusercontent.com/--0nkparVSI0/Vj22ttxTSPI/AAAAAAAAAA4/oyZwenqUf2Y/s1600/CountriesReport2.jpg> >> >> >> <https://lh3.googleusercontent.com/-Ulyv9Uo-U_Y/Vj22zDAUz4I/AAAAAAAAABA/XhiEfVLB8zs/s1600/CountriesReport3.jpg> >> >> <https://lh3.googleusercontent.com/-QigPM6MGLS8/Vj223l3AiwI/AAAAAAAAABI/oynrIlh7lcM/s1600/CountriesReport4.jpg> >> First Picture is start of app >> Second Picture is after Print Report Button was pressed >> Third Picture is my pdf-file >> Fourth Picture is after closing the pdf viewer >> >> Any suggestions will be appreciated. >> >> Karl:-) :) :] =) >> >> Am Freitag, 6. November 2015 20:36:33 UTC+1 schrieb Anthony: >> >>> Also, dict() is for creating a dictionary -- there is no reason to do >>> dict(redirect(...)). Also, you do not return a redirect() -- you simply >>> call it, and it immediately raises an HTTP exception. >>> >>> Anthony >>> >>> On Friday, November 6, 2015 at 1:50:15 PM UTC-5, Dave S wrote: >>>> >>>> >>>> >>>> On Friday, November 6, 2015 at 9:33:47 AM UTC-8, Karl Florian wrote: >>>>> >>>>> *Sorry everybody but i need your help again.* >>>>> >>>>> Here is my code: >>>>> >>>>> def languages_pedit(): >>>>> >>>> >>>> [...] >>>> >>>> >>>>> >>>>> >>>>> * #I tried this mk_pdffile(pdffile,'languages.pdf') but it did not >>>>> work* >>>>> >>>>> def mk_pdffile(pdffile,pdfname): >>>>> >>>>> import cStringIO >>>>> >>>>> pdfdata = open(pdffile,"rb").read() >>>>> >>>>> response.headers['Content-Type']='application/pdf' >>>>> >>>>> return response.stream(cStringIO.StringIO(pdfdata), attachment=True, >>>>> filename=pdfname) >>>>> >>>>> >>>> Where does the "does not work" part stop and the "this works fine part >>>> start? >>>> >>>>> >>>>> >>>>> @auth.requires_login() >>>>> >>>>> def print_languages(): >>>>> >>>> [...] ....................................... >>>>> >>>>> #Code to make my texfile.................... >>>>> >>>>> ....................................... >>>>> >>>>> texfile.write('\\end{document}\n') >>>>> >>>>> [...] >>>> >>>>> return response.stream(cStringIO.StringIO(pdfdata), attachment=True, >>>>> filename='languages.pdf') >>>>> >>>>> >>>>> >>>>> *This works fine but the code below does not get excecuted and my >>>>> SUBMIT Button stays pressed?* >>>>> >>>>> >>>>> >>>>> return dict(redirect(URL('languages_pedit'))) >>>>> >>>>> >>>> >>>> Where does this go? If right after the "return response.stream()", >>>> then it will never get executed. >>>> >>>> >>>>> def example(): >>>> return 1 >>>> return 2 >>>> >>>> >>>> will always return 1. >>>> >>>> /dps >>>> >>>> >>> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
### Model File ### db.define_table( 'alcountries', Field('ctry_iso', 'string', unique=True, length=2, label='Country-ISO'), Field('description', 'string', length=80, requires=[IS_NOT_EMPTY()], label='Description'), Field('embargo_yn', 'boolean', label='Embargo-Y/N', comment='Test comment'), Field('lang_iso', 'string', length=2,requires=IS_IN_DB(db,db.allanguages.lang_iso,'allanguages.description'), label='Language-ISO'), Field('date_changed', 'datetime', update = request.now, writable = False, label='Modified'), Field('user_id', 'reference auth_user', update=auth.user and auth.user.id, writable = False, readable = False), migrate=settings.migrapp, redefine=settings.redefin, format='%(ctry_iso)s' ) ### Controller ### @auth.requires_login() def print_countries(): btn_list = [TAG.button(SPAN(_class="icon-print glyphicon glyphicon-print"),' Report', _type='submit', _id='submit_btn'),TAG.button(SPAN(_class="icon-refresh glyphicon glyphicon-refresh"),' Refresh',_type='button',_onClick = "parent.location='%s' " % URL('print_countries'))] form = SQLFORM.factory( Field('sortpdf', 'string', label='Sort-by', requires=IS_IN_SET(['ISO-Code','Description']), default='ISO-Code'), buttons = btn_list, formstyle = 'table3cols', submit_button='Submit') if form.process().accepted: response.js = 'window.location = "%s";' % URL('default', 'get_countriespdf', args=request.vars.sortpdf) ### redirect(URL('default', 'get_countriespdf',args=request.vars.sortpdf)) elif form.errors: response.flash = 'form has errors' response.title = 'Countries' return dict(form=form) def get_countriespdf(): sortpdf=str(request.args(0)) #if len(request.args): response.flash = 'i am in get_countriespdf' import datetime now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M") #sortpdf = form.vars.sortpdf if sortpdf=='ISO-Code': ORDERBY=db.alcountries.ctry_iso else: ORDERBY=db.alcountries.description records = db(db.alcountries.id>=0).select(orderby=ORDERBY) ltxfile = str(os.path.join(request.folder, 'tex', 'countries.tex')) pdffile = str(os.path.join(request.folder, 'tex', 'countries.pdf')) with open (ltxfile, 'wb') as texfile: #... ### this is where i creat my texfile ### #... texfile.close() os.system('pdflatex '+ltxfile) if os.path.isfile(pdffile): os.remove(pdffile) os.rename('countries.pdf', pdffile) import cStringIO pdfdata = open(pdffile,"rb").read() response.headers['Content-Type']='application/pdf' return response.stream(cStringIO.StringIO(pdfdata), attachment=True, filename='countries.pdf') ### print_countries view ### {{extend 'layout.html'}} {{block center}} <div class="container-fluid" id="inputall"> <div class="col-md-3"></div> <div class="col-md-6"> <H3 style="text-align:left;">{{=T(response.title)}}</H3> {{=LOAD('default','get_countriespdf.load',ajax=True,target='get_countriespdf')}} {{=form}} </div> <div class="col-md-3"></div> </div> <div style="clear: both;"></div> {{end}} If i do it this way, the pdf data gets mixed into my form view if i use a additional get_countriespdf view like this, it does not work. ### get_countriespdf view ### {{extend 'layout.html'}} {{=LOAD('default','get_countriespdf.load',ajax=True,target='get_countriespdf')}}