Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 主干删除请求的基本URL不正确-使用相对URL而不是绝对URL_Django_Backbone.js_Cordova_Tastypie - Fatal编程技术网

Django 主干删除请求的基本URL不正确-使用相对URL而不是绝对URL

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/

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/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()
方法。但是,重写它可以正常工作,所以我将继续。也许你想检查你正在使用的主干版本。。。很高兴一切都正常工作:-)