I'm trying to make a "vote up" and "vote down" feature in my program, like the one in reddit.com. But I've been receiving tickets from 2 different errors. (I solved the first one but I want to First, I received a "UnboundLocalError: local variable 'books' referenced before assignment" This was my code at the time when I had that error. *CONTROLLER: * def vote_callback(): vars = request.post_vars if vars and auth_user: *id = vars.id* direction = +1 if vars.direction == 'up' else -1 *books = db.books(id)* if books: votes = db.votes(post=id, created_by=auth.user.id) if not votes: books.update_record(vote_book=books.book_vote+direction) db.votes.insert(post=id,score=direction) elif votes.score!=direction: books.update_record(vote_book=books.book_vote+direction) votes.update_record(score=direction) else: pass print books.book_vote return str(books.book_vote)
*VIEW:* <head> <script type = "text/javascript" src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> </head> <body> <h1>This is the default/list_books_by_vote.html template</h1> {{if request.function=='list_books_by_vote':}} {{=A('sort by datetime', _class='btn', _href=URL('list_books_by_datetime'))}} {{elif request.function=="list_books_by_datetime":}} {{=A('sort by votes', _class='btn', _href=URL('list_books_by_vote'))}} {{else:}} <h1> {{=author(user_id)}} </h1> {{pass}} {{for post in rows:}} <div class="well"> <table> <tr *data-id="{{=post.id}}"*> <td> <button *data-direction="down"* class="btn btn-primary"> Remove vote </button> </td> <td> <span *class="votes"*> *{{=post.book_vote}}* </span> </td> <td> <button *data-direction="up"* class="btn btn-success" style="margin-left:5px;margin-right:5px;"> I referenced this! </button> </td> <td> <strong>{{=A(post.book_title, _href=URL('show_specific_user', args=post.id))}}</strong> </td> <td> <span> {{=author(post.modified_by)}} </span> </td> </tr> </table> </div> {{pass}} *<script type = "text/javascript">* * function do_ajax_vote(t, direction) {* * var id = jQuery(t).closest('tr').attr('data-id');* * jQuery.ajax({method:'post',url:'{{=URL('vote_callback')}}',* * data:{'id':id,'direction':direction},* * success: function(data){* * jQuery(t).closest('tr').find('.votes').html(data);* * } });* * }* * jQuery(function() {* * jQuery('[data-direction=up]').click(function(){do_ajax_vote(this, 'up');});* * jQuery('[data-direction=down]').click(function(){do_ajax_vote(this, 'down');});* * });* *</script>* </body> *Model:* db.define_table('books', Field('book_title', 'string', requires=(IS_NOT_IN_DB(db,'books.book_title'), IS_NOT_EMPTY()), label='Thesis Title'), Field('book_subtitle', 'string', label='Thesis Subtitle (Optional)'), Field('book_date', type='date', requires=IS_DATE(), label='Publish Date' ), Field('book_abstract', type='text', requires=IS_NOT_EMPTY() , label='Thesis Abstract' ), Field('book_school', requires=IS_IN_SET(['AMA Computer College - Naga Campus', 'Ateneo de Naga University', 'Naga College Foundation', 'Computer Communication Development Institute', 'University of Nueva Caceres']), label='Orginating School' ), Field('book_location', requires=IS_IN_SET(['AMA Computer College - Naga Campus', 'Ateneo de Naga University', 'Naga College Foundation', 'Computer Communication Development Institute', 'University of Nueva Caceres']), label='Location' ), Field('book_proponents', requires=IS_NOT_EMPTY(), label='Thesis Proponents' ), Field('book_category', requires=IS_IN_SET(['Education, Science and Teacher Training', 'Fine and Applied Arts', 'Humanities', 'Religion and Theology', 'Social Behavioral Sciences', 'Business Administration and Related', 'Law and Jurispusence', 'Natural Science', 'Mathematics', 'IT-Related Disciplines', 'Engineering and Tech', 'Medical and Allied', 'Trade, Craft and Industrial', 'Architecture and Town Planning', 'Agriculture, Forestry, Fisheries', 'Home Economics', 'Service Trades', 'Mass Communication and Documentation', 'Maritime', 'General', 'Other Disciplines']), label='Thesis Category' ), Field('book_level', requires=IS_IN_SET(['Undergraduate', 'Masteral']), label='Thesis Level' ), Field('book_course', requires=IS_IN_SET(['Bachelor of Science in Information Technology', 'Bachelor of Science in Computer Science']), label='Proponent\'s Course' ), * Field('book_vote', 'integer', default=0, readable=True, writable=True),* auth.signature ) *db.define_table('votes',* * Field('books', 'reference books'),* * Field('score', 'integer', default=+1),* * auth.signature* * )* I "solved" the problem when I searched the internet and saw this "http://stackoverflow.com/questions/15217145/local-variable-author-referenced-before-assignment". I learned that I should transfer these lines: *id = vars.id* *books = db.books(id)* outside of the loop. I did that so I'm not getting that error anymore. Now, I'm getting another error when I transfered the two varianles outside the loop. I tried looking for answers in the internet to no avail. The error is: UnboundLocalError: local variable 'books' referenced before assignment *CONTROLLER: * def vote_callback(): vars = request.post_vars *id = vars.id* * books = db.books(id)* if vars and auth_user: direction = +1 if vars.direction == 'up' else -1 if books: votes = db.votes(post=id, created_by=auth.user.id) if not votes: books.update_record(vote_book=books.book_vote+direction) db.votes.insert(post=id,score=direction) elif votes.score!=direction: books.update_record(vote_book=books.book_vote+direction) votes.update_record(score=direction) else: pass print books.book_vote return str(books.book_vote) *VIEW:*The same *Model:*The same P.S. -I highlighted the relevant parts of the code. -The View and the Model is working. I think the problem with the code is in the controller. -I'm trying to do this at 27:58 https://www.youtube.com/watch?v=DIOFcDIlHWI&index=3&list=PLG0pjuN991OmU891IjbxOss3kYEz_JMR7 *Thanks in advance.* -- 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.