在 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.POSTrequest.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 值的主要内容,如果未能解决你的问题,请参考以下文章

django 获取 POST 请求值的几种方法

django 获取 POST 请求值的几种方法

在 django 中单击按钮获取输入值

Django中使用POST方法获取POST数据

从 Django POST 请求中获取表格并在 handsontable 中显示(在 javascript 中读取值)

如何在 Django 中获取更新的类变量值