Pinax源代码分析15 - avator, locations, friends_objects
avator
头像app。
(r'^avatar/', include('avatar.urls')),
urlpatterns = patterns('avatar.views',
#修改头像
url('^change/$', 'change', name='avatar_change'),
#删除头像
url('^delete/$', 'delete', name='avatar_delete'),
)
测试的时候报错,只要一上传头像就抛出异常:decoder jpeg not available。
Google了一下,是PIL的问题。需要修改PIL的编译配置,问题是安装Pinax的虚拟环境的时候,Pinax就找不到系统已经安装的PIL,采用的已经是Google到的hack,相当于在Pinax的虚拟环境里又安装了一个别人编译好的PIL……放弃修复。
swaps
用户之间交换物品的app,不太感兴趣。
关闭swaps app
修改settings.py,注释掉INSTALLED_APPS中的swaps。
注释掉urls.py中的:
(r'^swaps/', include('swaps.urls')),
修改site_base.html模板,去掉:
<td class="tab rtab_swaps"><div><a href="{% url offer_list_all %}">{% trans "Swaps" %}</a></div></td>
flag
越过。
locations
该app 是记录某一个时间,你所在的地点。基于Yahoo Map。
需要注册 yahoo map api 的 key。访问 https://developer.yahoo.com/wsregapp/ 注册,将得到的key复制到settings的
YAHOO_MAPS_API_KEY
url
(r'^locations/', include('locations.urls')),
逻辑与模板
url(r'^$', 'locations.views.your_locations', name='loc_yours'),
显示你的所有 check in 过的地点。点击任意一个地点的说明就会在地图上显示这个点。
该页有一个搜索form,提交到/new/。
url(r'^new/$', 'locations.views.new', name='loc_new'),
接受your_locations 提交过来的字符串,然后使用
geopy.geocoders.Yahoo(lazy_key())
(place, (lat, lng)) = list(y.geocode(p, exactly_one=False))[0]
来获得地点的经纬度。将它们传递给 checkin.html 模板,作为隐藏域。表单提交地址为/checkin/。
url(r'^checkin/$', 'locations.views.checkin', name='loc_checkin'),
记录地点的经纬度、check in 的用户、时间。
url(r'^friends/checkins/$', 'locations.views.friends_checkins', name='loc_friends'),
好友的checkins。
url(r'^nearby/checkins/$', 'locations.views.nearby_checkins', name='loc_nearby'),
临近的checkins。同样依赖于geopy。我这里一直显示错误:'module' object has no attribute 'arc_degrees'。
friends_objects
urls.py 中的最后几行:
urlpatterns += patterns('',
url('^photos/friends_photos/$', 'friends_app.views.friends_objects', kwargs=friends_photos_kwargs, name="friends_photos"),
url('^blog/friends_blogs/$', 'friends_app.views.friends_objects', kwargs=friends_blogs_kwargs, name="friends_blogs"),
url('^tweets/friends_tweets/$', 'friends_app.views.friends_objects', kwargs=friends_tweets_kwargs, name="friends_tweets"),
url('^bookmarks/friends_bookmarks/$', 'friends_app.views.friends_objects', kwargs=friends_bookmarks_kwargs, name="friends_bookmarks"),
)
所有的这些urls都由 friends_app.views.friends_objects 处理。以 friends_photos 为例,传递给 view 的参数为 friends_photos_kwargs:
friends_photos_kwargs = {
"template_name": "photos/friends_photos.html",
"friends_objects_function": lambda users: Image.objects.filter(member__in=users),
}
template_name 决定view将采用的模板。
friends_objects_function 接受用户所有的朋友作为参数:
dictionary = {
"object_list": friends_objects_function(friends),
}
之后dictionary 会被传递给模板:
{% for photo in object_list %}
……
{% endfor %}