【发布时间】:2023-03-23 10:14:02
【问题描述】:
我有一个使用 django-rest-framework 构建的 API,我希望向它添加过滤。我在这里遵循指南: http://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend
我看到了两个问题:
- 生成的表单使用
method="post"。我的 API 目前仅支持 GET 请求,并且应用过滤器会导致“405 方法不允许”错误。 - 生成的表单没有提交按钮,但示例截图有。
我的模块版本:
姜戈 (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.htmlrest 框架中的模板最后有这个
{% 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);
});
【问题讨论】:
标签: python django django-rest-framework