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.

Reply via email to