Django 主干删除请求的基本URL不正确-使用相对URL而不是绝对URL
TL;DR版本: 使用主干网构建Phonegap应用程序,有一个称为客户端的模型和一个称为客户端的集合。使用tastypieapi与单独的服务器通信。当我运行Django 主干删除请求的基本URL不正确-使用相对URL而不是绝对URL,django,backbone.js,cordova,tastypie,Django,Backbone.js,Cordova,Tastypie,TL;DR版本: 使用主干网构建Phonegap应用程序,有一个称为客户端的模型和一个称为客户端的集合。使用tastypieapi与单独的服务器通信。当我运行fetch()时,URL使用正确的绝对URL(类似http://127.0.0.1:8000/api/v1/client/1/,但当我运行Client.destroy()时,它使用的相对URL为file:///api/v1/client/1/。如何使其使用绝对URL删除对象 长版本: 我正在用Backbone.js构建一个使用Django/
fetch()
时,URL使用正确的绝对URL(类似http://127.0.0.1:8000/api/v1/client/1/
,但当我运行Client.destroy()
时,它使用的相对URL为file:///api/v1/client/1/
。如何使其使用绝对URL删除对象
长版本:
我正在用Backbone.js构建一个使用Django/Tastypie API的移动应用程序,我遇到了一些我无法理解的看似奇怪的行为
我在文件顶部为服务器定义了一个基本URL:
// Set the base URL for querying the API
baseUrl = 'http://127.0.0.1:8000/api/v1/';
我有以下型号和系列:
// Client model
Client = Backbone.Model.extend({
urlRoot: baseUrl + 'client',
// Default values
defaults: {
id: '',
name: '',
mobile: '',
email: '',
notes: '',
operator: '',
date_client_joined: '',
address: '',
postcode: ''
}
});
// Client collection
Clients = Backbone.Collection.extend({
// Will hold Client objects
model: Client,
// Set URL
url: baseUrl + 'client/'
});
并使用以下视图在列表中呈现各个客户端:
// Client list item view
ClientListItemView = Backbone.View.extend({
tagName: 'li',
events: {
'click .delete': 'deleteclient'
},
render: function () {
// Render the client list item template
var template = _.template($('#client-list-item-template').html());
this.$el.html(template(this.model.toJSON()));
// Return the object
return this;
},
deleteclient: function () {
this.model.destroy();
return false;
}
});
现在,该应用程序实际上使用jQuery Mobile,每个客户端旁边都有一个带有Delete类的Delete按钮,因此每次单击其中一个按钮时都会执行deleteclient函数。我还使用主干tastypie来消除主干和tastypie之间的不一致
deleteclient函数正在运行,但它将HTTP DELETE请求发送到file:///api/v1/client/1/
(由于这是一个Phonegap应用程序,我只是在本地查看文件)。从文档设置来看,手动设置urlRoot似乎是一种方法,但这样做似乎无法解决问题。运行fetch()用于填充集合的函数工作得非常好,但是-它使用了正确的绝对URL
因此,我的问题是如何覆盖默认行为并确保将HTTP DELETE请求发送到正确的URL?我找到了一个解决方案,尽管我并不完全满意:
deleteclient: function () {
if (confirm('Are you sure you wish to delete this client?')) {
// Destroy the model
this.model.destroy({
url: baseUrl + 'client/' + this.model.get('id') + '/'
});
// Remove the view
this.remove();
}
}
基本上,如果我显式地通过URL to destroy(),就可以了。我找不到一种更干净利落的方法来做这件事,这有点令人恼火,因此我愿意接受任何其他做同样事情的方法。我找到了一个解决方案,尽管我并不完全满意:
deleteclient: function () {
if (confirm('Are you sure you wish to delete this client?')) {
// Destroy the model
this.model.destroy({
url: baseUrl + 'client/' + this.model.get('id') + '/'
});
// Remove the view
this.remove();
}
}
基本上,如果我显式地通过URL来销毁(),就可以了。我找不到一个更简单的方法来完成这项工作,这有点令人恼火,因此我愿意接受任何其他方法来完成同样的事情。通过查看您的代码,它应该可以正常工作。主干中的模型已经有了一个
URL()
定义了执行此操作的函数:
url: function() {
var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
},
您可以使用调试器查看它是否进入此代码中以及结果是什么吗?主要检查\uuu.result()
调用中的值
无论如何,您可以覆盖模型中的url
属性,而不是在每次调用destroy()
时都传递它:
通过查看您的代码,它应该工作正常。主干中的模型已经定义了一个
url()
函数,该函数应该执行以下操作:
url: function() {
var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
},
您可以使用调试器查看它是否进入此代码中以及结果是什么吗?主要检查\uuu.result()
调用中的值
无论如何,您可以覆盖模型中的url
属性,而不是在每次调用destroy()
时都传递它:
由于某种原因,没有调用
url()
方法。但是,重写它可以正常工作,因此我将继续。也许您想检查您正在使用的主干版本…很高兴一切正常:-)由于某种原因没有调用url()
方法。但是,重写它可以正常工作,所以我将继续。也许你想检查你正在使用的主干版本。。。很高兴一切都正常工作:-)