开发者

django calling no request view function in template

I am making some view functions to calculate the rank of one user in a community. My problem is that i want to display the rank afferent to each user, in its profile, and i don't know how, since i don;t have a request and a render_to_response (cause i guessed they are not needed) my code:

def calculate_questions_vote(request):
    useranswer = Answer.objects.filter (answer_by = request.user)
    positive_votes = VoteUpAnswer.objects.filter(answer = useranswer)
    negative_votes = VoteDownAnswer.objects.filter(answer = useranswer)
    question_vote_rank = sum(positive_votes) - sum(negative_votes.count)
        return question_vote_rank

def calculate_replies(request):
    the_new = News.objects.filter(created_by = request.user)
    reply = Reply.objects.filter(reply_to = the_new)
    reply_rank = sum(reply)
        return reply_rank

def calculate_votes(request):
    the_new = News.objects.filter(created_by = request.user)
    vote = Vote.objects.filter(voted = the_new)
    vote_rank = sum(vote)
        return vote_rank

def personal_rank(request):
    personal_rank = question_vote_rank + reply_rank + vote_rank
        return personal_rank

and in UserProfiles:

user = re开发者_StackOverflow中文版quest.user  
personal_rank = calculate_questions_vote(user) + calculate_replies(user) + personal_rank(user)

but my error is:

Error binding parameter 0 - probably unsupported type.

Is mt approach correct? How should i call the rank function in the profile_view def ?

Thanks!


YOu can call the function in your view like rank = personal_rank(reuest.user) and add rank to your context then.
I wouldnt call this functions "view"-functions, since they are not dealing with a request nor are they returning a HttoResponce; they are more "helper" functions and also don't belong to a model if they are dealing with seperate entities (eg. News & Vote). A descent place for them would be eg. utils.py. You import them from there in your views.py and call them with the user as parameter (if it's the actual user it's request.user).
It makes sense that you can't access request from everywhere, because this forces you to keep more to a mvc-like design, if you need request somewhere you need to pass it on from your original view function! You should change your last function to:

def personal_rank(user):
    personal_rank = calculate_questions_vote(user) + \
                    calculate_replies(user) + \
                    calculate_votes(user)
    return personl_rank

You could also add this last function to your User or UserProfile model class if you have something like that and then call eg. my_user.personal_rank() or my_user.get_profile().personal_rank().


lazerscience gave good explanation for your guestion. I just want to point some possible performance issues.

Please note that calling this method for each User yields with 7 queries. If your case will be showing rank for all users it might take a lot of time. I suggest make some caching (like in StackOverflow). There are many options here, for example you can assign special rank field to a User model (or UserProfile if User is auth.User) in which you could store precalaculated rank (calculated just after some operation, like News saving or in some scheduled intervals).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜