用于vingd集成的django应用程序
django-vingd的Python项目详细描述
django vingd支持将vingd集成到django项目中。
基本设置
- 在已安装的应用程序中添加“django-u-vingd”。
- 配置django设置:
VINGD_SETTINGS={'sandbox':{'VINGD_USR':'test@knopso.com','VINGD_PWD':'123',}}VINGD_MODE='sandbox'
- 在任何使用vingd的django应用程序中定义vingd orders details(models.py):
# Imaginary scenario where users are voting for candidates via vingd.fromdjango.dbimportmodelsfromdjango.httpimportHttpResponseRedirectfromdjango_vingd.modelsimportVingdOrderclassCandidate(models.Model):name=models.CharField(max_length=128)votes=models.IntegerField(default=0)defadd_vote(self):Candidate.objects.filter(id=self.id).update(votes=models.F('votes')+1)self.votes+=1classVoteOrder(VingdOrder):candidate=models.ForeignKey(Candidate)# Short object descriptiondefget_display_name(self):return'Vote for candidate'# Handle form submission (before sending user to vingd)deftake_order(self):self.candidate_id=self.request.POST.get('candidate_id')# Determine vingd pricedefget_vingd_amount(self):return75# 0.75 vingd# Access is confirmed (user has returned back from vingd)defaccept_order(self):self.candidate.add_vote()# Serve requested content to userdefsuccess_response(self):returnHttpResponseRedirect('/')
- 在url(url.py)中注册订单类:
fromdjango_vingd.modelsimportVingdMetafrombase.modelsimportVoteOrderVingdMeta.register([VoteOrder,])urlpatterns=patterns('',(r'^vgd/',include('django_vingd.urls')),)
- 在HTML模板中放置Vingd订单:
{%forcandidateincandidates%} <form action="{%urlvingd_order"VoteOrder"%}" method="POST"> {%csrf_token%}{{candidate.name}}: {{candidate.votes}} <input type="hidden" name="candidate_id" value="{{candidate.id}}"> <input type="submit" value="vote"> </form> {%endfor%}
同步数据库并启动引擎!
弹出式版本
- 将jquery添加到页面中。
- 将弹出窗口相关的javascript添加到html头:
{%loadvingd_tt%}{%vingd_scripts%} <script type="text/javascript"> $(document).ready(function(){ $('form').vingd_popup(function(data){ alert('Vote added!'); }, function(data){ alert('Failed to add vote.'); }); }); </script>
- 处理voteorders中的ajax请求(models.py):
fromdjango_vingd.utilimportHttpResponseJSON# ...defsuccess_response(self):request=self.requestifrequest.is_ajax():returnHttpResponseJSON({'ok':True,'votes':self.candidate.votes,})returnHttpResponseRedirect('/')
拒绝访问内容
在某些情况下,不应允许用户访问内容。此类案件应同时处理:
- 在vingd订购时拒绝访问(在将用户发送到vingd之前)
- 在vingd验证时拒绝访问(在用户从vingd返回后)。
在这种情况下,应分别在接受令和接受令内提出例外。
处理异常
要优雅地处理任何类型的异常,应该使用vingdorder handle_exception函数:
defhandle_exception(self,e):# log exception# inform userreturnHttpResponse("Inform user that something has gone wrong.")