当前位置: 首页 > 知识库问答 >
问题:

带有Django Rest框架和DataTables的POST返回400错误请求

薛扬
2023-03-14

当我使用DRF的可浏览API时,我可以发布和删除。试图通过我的tradingbook.html(w/DataTables)复制此消息(新建/编辑/删除):错误请求: /api/trading/带"POST /api/trading/?格式=数据

我在这件事上花了太多时间,我永远都不会承认。

class TradingBook(models.Model):
trader =        models.TextField(max_length=10)
status =        models.TextField(max_length=10)
price =         models.TextField(max_length=10)
volume =        models.TextField(max_length=10)
index =         models.TextField(max_length=10)
cpty =          models.TextField(max_length=10)

class Meta:
        ordering = ['trader']

def __str__(self):
    return self.trader

连载器。派克

class TradingBookSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only=True)

class Meta:
    model = TradingBook
    fields = "__all__" 

DT_RowId = serializers.SerializerMethodField() 

def get_DT_RowId(self, TradingBook):
    return 'row_%d' % TradingBook.pk

意见。派克

@csrf_exempt#@csrf_protect#@ensure_csrf_cookie
def tradingsomething(request):  
    return render(request, 'trading/tradingbook.html')

@method_decorator(login_required, name="dispatch")
class TradingBookViewSet(viewsets.ModelViewSet):
        queryset = TradingBook.objects.all()#.order_by('trader')
        permission_classes  = [permissions.AllowAny]   
        serializer_class = TradingBookSerializer

urls.py

path('trading', trading_views.tradingsomething),
    path('trading/<int:pk>/', trading_views.TradingBookViewSet, name='TradingBook'),

    path('api/', include(router.urls)),

urlpatterns += router.urls

还有我的传统书籍。html

<script>
$(document).ready(function() {

    function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
    $.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
    });
    var csrftoken =  jQuery("[name=csrfmiddlewaretoken]").val(); // <--important
    
    
    editor = new $.fn.dataTable.Editor( {
        ajax:"/api/trading/?format=datatables&keep=id",
        table: "#TradingBook",
        fields: [ 
            {   label:  "trader:",
                name:   "trader"
             },
            {   label:  "status:",
                name:   "status"
             }, 
            {   label:  "price:",
                name:   "price"
             }, 
            {   label:  "volume:",
                name:   "volume",
             },
            {   label:  "index:",
                name:   "index",
             },
            {   label:  "cpty:",
                name:   "cpty",
             },
        ]
     } );    
    $('#TradingBook').on( 'click', 'tbody td:not(:first-child)', function (e) {
        editor.inline( this );
     } );

    var table = $('#TradingBook').DataTable({
        ajax:"/api/trading/?format=datatables&keep=id",
        dom: 'Bfrtip',
        headers: {'X-CSRFToken': '{{ csrftoken }}'},
        processing: true,
        serverSide: true,
        select: true, 
        type: "POST",  
        language: {
            search: "_INPUT_",
            searchPlaceholder: "Search..."
         },
        columns: [
            {"data": "trader"},
            {"data": "status"},
            {"data": "price"},
            {"data": "volume"},
            {"data": "index"},
            {"data": "cpty"},
         ],
        select: true,
        buttons: [
            {extend: "create", editor: editor},
            {extend: "edit", editor: editor},
            {extend: "remove", editor: editor}     
         ],
     });
    table.buttons().container()
        .appendTo($('.col-md-6:eq(0)', table.table().container()));

 });

</script>
{% block content %} 
  {% csrf_token %}
 <div class="container" style="font-size: .9em;">
        <div class="row">
            <div class="col-sm-12">
                <table id="TradingBook" class="table table-striped table-bordered" style="width:100%">
                    <thead>
                    
                    <tr>
                    <th data-data="trader">trader</th>
                    <th data-data="status">status:</th>
                    <th data-data="price">price:</th>
                    <th data-data="volume">volume:</th>
                    <th data-data="index">index</th>
                    <th data-data="cpty">Cprty:</th>
                    </tr>
                    </thead>
                </table>
            </div>
        </div>
    </div>
{% endblock %}

我的网络检查员

这就是我尝试从中编辑时发生的情况http://127.0.0.1:8000/trading终端返回错误请求:/api/trading/[15/May/2020 14:06:06]“POST/api/trading/?format=datatables

这是我第一次敢于提出问题,并希望在描述上更透彻。我担心这对给出答案的人来说可能微不足道,但我非常感谢你抽出时间。

共有2个答案

慕佑运
2023-03-14

我也遇到了同样的问题,对我来说,问题是数据表声明中的一个字段名称与我的模型不匹配。只是一个愚蠢的错误。

方风华
2023-03-14

Delete现在通过DataTables JS插入工作

remove: {
            type: 'DELETE',
            headers: { "X-CSRFTOKEN": csrftoken },
            url:        "/api/trading/_id_/",
            contentType: 'application/json',
            data: function ( d ) {
                return JSON.stringify( d );
            },
        },
 类似资料:
  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 问题内容: 这工作正常: 这将返回400 Bad Request(只是使用.ajax来支持错误处理的上述jQuery的重新格式)。 问题答案: 我认为您只需要再添加2个选项(和):

  • 我试图使用Gmail API将用户设置应用到Gmail帐户,但它不断返回错误400错误请求。 我可以看到错误代码在Gmail API控制台,它来自我的服务号,所以代码不可能是如此错误,但它让我发疯,只是不能找出什么是错误的。 如果有人能给我指出正确的方向,我会非常感激。

  • 我试图使超文本传输协议后请求获得api令牌。如果成功,它应该返回访问令牌、令牌类型(承载)和expires_in的字符串值。 我的代码是一个通用的,我希望看到它能工作。但是由于某些原因,它抛出了一个例外400“远程服务器返回了一个错误。错误请求”。我一直在尽一切努力修复这个问题,但结果没有改变。 当我调试代码并在输出窗口中看到结果时,数据流有一个异常,说“这个流不支持查找操作” 我怀疑这是由于po

  • 默认情况下,当凭据错误时,DRF-JWT返回400状态的响应。为什么会这样?当用户没有提供正确的登录信息时,浏览器控制台中会写入错误的请求日志。因此,我在前端处理错误,但仍然没有控制台错误消息。那么,我如何才能超越JWT,不筹集400美元,而是返回成功,正确的方法是什么?

  • 问题内容: 我有这个应用程序,它可以在本地运行,并且在部署时可以使用.mdf SQL Express数据库文件(通常用于测试目的)。但是,当我将其更改为可与我们的SQL Server 2008一起使用时,该应用程序可以运行,但该服务无法运行。 例如,如果在页面后面的代码中,我有一个按钮可以向表中添加数据,例如: 我的web.config设置为在该服务器上使用模拟,并且一切运行良好。但是,对于我的服