更改Django Rest Framework过滤模式中的提交方法

时间:2016-01-28 14:54:55

标签: python django django-rest-framework

我有一个用django-rest-framework构建的API,我希望为它添加过滤功能。我在这里关注指南: http://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend

我看到两个问题:

  • 生成的表单使用method="post"。我的API目前仅支持GET请求,并且应用过滤器会导致“405 method not allowed”错误。
  • 生成的表单没有提交按钮,但示例屏幕截图没有。

我的模块版本:
Django(1.8)
django-crispy-forms(1.6.0)
django-filter(0.12.0)
django-guardian(1.3.2)
django-mssql(1.7)
django-pyodbc(0.3.0)
django-rest-swagger(0.3.4)
djangorestframework(3.3.2)

我已经挖掘了模板,看起来没有简单的方法来覆盖表单创建。其余框架中的base.html模板最后都有这个

{% if filter_form %}
{{ filter_form }}
{% endif %}

但它包含在{% block body %}中,所以要用我自己的模板覆盖它,我还必须包含正文中的其他所有内容。这似乎是错误的解决方案。

我还搜索了文档,寻找指定GET而不是POST的地方,并且没有发现任何提及。

我不想更改API以通过POST方法处理过滤器。最终API将被扩展为支持实际创建新资源的真实POST方法,因此现在通过POST应用过滤器只会产生其他问题。

有没有办法更改模态表单的提交方法?或者用我自己的模态模板覆盖它而不重复身体块的其余部分的好方法?

=====
修改 我已经设法使用一些jQuery来纠正上述问题,但这感觉相当hackish。如果有更好的解决方案,我仍然会对此感兴趣。

$(document).ready(function () {
    // change filter submit method to GET instead of POST
    var form = $('#filtersModal form');
    form.attr('method', 'get');

    // add a submit button to the filter modal dialog
    var cancel = $('<button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>');
    var submit = $('<button type="submit" class="btn btn-primary">Apply</button>');

    var footer = $('<div class="modal-footer"></div>');
    footer.append(cancel);
    footer.append(submit);

    form.append(footer);
});

1 个答案:

答案 0 :(得分:0)

我想这是一个迟到的回复。

扩展您的过滤器类
django_filters.rest_framework.FilterSet

而不是

django_filters.FilterSet

Solution described here