Pinax源代码分析13 - bookmarks
第三方app Django_bookmarks
url
(r'^bookmarks/', include('bookmarks.urls')),
逻辑与模板
urlpatterns = patterns('',
#显示所有的书签
url(r'^$', 'bookmarks.views.bookmarks', name="all_bookmarks"),
#用户的书签列表
url(r'^your_bookmarks/$', 'bookmarks.views.your_bookmarks', name="your_bookmarks"),
#添加书签
url(r'^add/$', 'bookmarks.views.add', name="add_bookmark"),
#删除书签
url(r'^(/d+)/delete/$', 'bookmarks.views.delete', name="delete_bookmark_instance"),
# for voting
(r'^(?P<object_id>/d+)/(?P<direction>up|down|clear)vote/?$',
vote_on_object, dict(
model=Bookmark,
template_object_name='bookmark',
template_name='kb/link_confirm_vote.html',
allow_xmlhttprequest=True)),
)
感觉这个app功能不全,不能浏览单独的bookmark,不能修改。一旦写错了就只能删除之后再重新创建。
urlpatterns的最后一行使用的是Django_voting的view。
bookmarks.html模板使用了voting app 定义的 voting_tags, misc app 定义的 extra_voting_tags。
{% extends "bookmarks/base.html" %}
{% load voting_tags %}
{% load extra_voting_tags %}
{% order_by_votes bookmarks %}
{% votes_by_user user on bookmarks as vote_dict %}
{% scores_for_objects bookmarks as score_dict %}
{% dict_entry_for_item bookmark from vote_dict as vote %}
{% dict_entry_for_item bookmark from score_dict as score %}
<a id="up_{{ bookmark.id }}" href="#" οnclick="vote({{ bookmark.id }}, '{% if vote and vote.is_downvote %}clear{% else %}up{% endif %}'); return false;"><img src="{{ MEDIA_URL }}bookmarks/img/up_{% if vote and vote.is_upvote %}mod{% else %}grey{% endif %}.png"/></a><br />
{% endif %}
<span id="bookmark_{{ bookmark.id }}_score">
{{ score.score|default:0 }} point{{ score.score|default:0|pluralize }}
</span><br />
{% if user.is_authenticated %}
<a id="down_{{ bookmark.id }}" href="#" οnclick="vote({{ bookmark.id }}, '{% if vote and vote.is_upvote %}clear{% else %}down{% endif %}'); return false;"><img id="img_{{ bookmark.id }}_down" src="{{ MEDIA_URL }}bookmarks/img/down_{% if vote and vote.is_downvote %}mod{% else %}grey{% endif %}.png"/></a>
{% endif %}
以上自定义标签除了 order_by_votes 由 misc 提供之外,全都是 voting提供的,每个标签都有 docstring。
url最后一行中的 template_name='kb/link_confirm_vote.html', 没有找到这个模板,但是投票功能一切运行正常。根据 voting.views.vote_on_object 的docstring:
The given template will be used to confirm the vote if this view is fetched using GET;
可见,如果是采用get方法投票的话,才需要这个模板。而bookmarks使用的是jquery 的 $.post 提交的请求,方法为POST,所以就不需要这个模板了。