【发布时间】:2016-07-18 13:37:04
【问题描述】:
我有一个 ajax 提交(GET 查询)。但它改变了我的数据库,所以聪明的人告诉我应该使用 POST 而不是 {% csfr_token %}。
GET 查询:
$(document).on('submit','#follow', function(e){
var $button = $(this).find('button');
e.preventDefault();
$.ajax({
url:'/event/{{ event.id }}/',
data: "add={{ event.id }}",
success:function(){
$('#follow').hide();
$('#unfollow').show();
}
})
});
views.py
...
event = get_object_or_404(Event, id=event_id)
user = request.user
if request.GET.get('add'):
event.users.add(user)
event.save()
if request.GET.get('remove'):
event.users.remove(user)
event.save()
...
所以我在数据中添加了type:"post", 和csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]),但我不知道用什么来代替if request.GET.get('add'): 和if request.GET.get('add'):。我试过if request.POST.get('add'):,但它不起作用。那么如何将 if 与 POST 值一起使用?
UPD。
好的,我现在有什么... 模板:
<form id="unfollow" {% if user not in event.users.all %}style="display:none;"{% endif %}>
<input type="hidden" value="{{ event.id }}" name="remove">
<button type="submit" class="btn btn-warning btn-block">{% trans "Unfollow"%}</button>
</form>
...
$(document).on('submit','#unfollow', function(e){
var $button = $(this).find('button');
e.preventDefault();
$.ajax({
type:"post",
url:'/event/{{ event.id }}/',
data: {
'action': 'remove'
},
success:function(){
$('#unfollow').hide();
$('#follow').show();
}
})
});
views.py:
def show_event(request, event_id):
event = get_object_or_404(Event, id=event_id)
user = request.user
if 'action' in request.POST:
if 'action' == 'add':
event.users.add(user)
event.save()
elif 'action' == 'remove':
event.users.remove(user)
event.save()
return render(request, 'events/event.html', {'event':event, 'user':user}
没有错误,但它不起作用。 success:function() 工作正常,但数据库没有变化。有什么建议吗?
我也试过if request.POST('action') == 'add':,但没有帮助
【问题讨论】:
-
它应该在
request.POST或request.body中。只需打印这些变量,您就会发现。 -
请注意,the docs 解释了如何在每个 ajax 请求中包含 CSRF 令牌作为标头,这样您就无需手动将其包含在 post 数据中。