在 Django 中获取 POST 值
Posted
技术标签:
【中文标题】在 Django 中获取 POST 值【英文标题】:Get POST values in Django 【发布时间】: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 数据中。
【参考方案1】:
对数据使用对象add: event.id
,而不是将其编码为字符串"add= event.id "
那么您应该能够使用以下任一方法从request.POST
获取值:
request.POST['add']
request.POST.get('add', 'default') # use default if key doesn't exist
你已经在 url 中有 event_id,所以你不需要设置add=event.id
。做类似的事情可能会更好”
'action': 'add'
然后在您看来,您可以执行以下操作:
if 'action' in request.POST:
if request.POST['action'] == 'add':
# do something
elif request.POST['action'] == 'remove':
# do something else
【讨论】:
谢谢,但是现在有MultiValueDictKayError,怎么回事? 表示该值不在request.POST
中。您没有显示足够的信息让我们判断问题是在您的视图还是模板中。请参阅我更新的答案,您可能想要更改您的 javascript 并稍微查看一下。
非常感谢您的回答。我更新了我的问题,你能帮忙吗?
代码中有错字。我写的是if 'action' == 'add'
而不是if request.POST['action'] == 'add'
。看起来您几乎尝试了正确的方法,但您应该使用方括号而不是圆括号来获取字典键。
还是一样...我在浏览器 POST 查询中看到带有 action:"remove" 参数但问题仍然存在【参考方案2】:
如果 QueryDict 为空,请尝试以下操作:
data = request.data['action']
【讨论】:
以上是关于在 Django 中获取 POST 值的主要内容,如果未能解决你的问题,请参考以下文章