Django 和 AngularJS:如何显示来自 Django 调试错误消息的 Angular $http 错误

Posted

技术标签:

【中文标题】Django 和 AngularJS:如何显示来自 Django 调试错误消息的 Angular $http 错误【英文标题】:Django and AngularJS: how to display Angular $http errors that come from Django debug error messages 【发布时间】:2014-09-10 19:44:44 【问题描述】:

我有一个使用 $http.post 从 Angular 调用的 Django 视图

//LOADFILE ===================
    this.loadfile = function (clickedItem) 
        $http.post('/display/' ,  "filename": clickedItem.fileName )
            .success(function(data) 
                    $scope.fileView.text = data;
                    $scope.fileView.title = clickedItem.title
            ).error(function(data) $scope.displayError=data);
    ;

如果 Django 抛出错误,数据将是一个完整的 Django 错误页面(完整的 html 页面)。

如何在 Angular 下显示该错误页面(完整的 html 页面)? (这里有一些关于模态的讨论:AngularJS, show popups - The most elegant way?,但没有关于完整的 html 页面......)

我认为我可以使用框架元素和 dom 来做到这一点:

$window.frames['myErrorFrame'].document.innerHTML = $scope.displayError;

但这看起来不是很Angularish...这几乎可以做到,但是我仍然有直接写入dom的问题,因为src是一个字符串:insert an iframe into page dynamically in AngularJS

有没有更好的方法在 Angular 中显示完整的 html 页面字符串?

【问题讨论】:

这似乎是相关的:***.com/questions/9381926/… 但它不能处理完整的 html 页面(带有 js 和 css 等);这就是 Django 发送的内容。 类似问题:***.com/questions/22047701/… 也许将其保存在模板缓存中,然后调用它来填充您的 ng-view。一旦你在 templateCache 中有它,你可以把它放在任何 ng-include 中,你甚至可以打开一个 modal 并显示其中的内容。 有趣的想法...我试过了: angular.element("#errorIFrame").append($compile(data));但这没有用(到目前为止)。我将阅读 templateCache。看起来像一个选项。 【参考方案1】:

这是一个可能的解决方案。它可以工作,但是有工作的程度,这有点 hacky - 工作的程度为零。

错误函数(来自Write elements into a child iframe using javascript or jQuery):

update_error = function (message) 
            var ifrm = document.getElementById('errorIFrame');
            ifrm = (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
            ifrm.document.open();
            ifrm.document.write(message);
            ifrm.document.close();
        ;

还有html:

<div ng-show="errorMessage != ''">
<button class="btn btn-info btn-xs" ng-click="errorMessage=''">Close</button><br />
<iframe  id="errorIFrame"> </iframe>
</div>

错误回调:

.error(function(data) 
                update_error(data);
                $scope.errorMessage="error"

注意 errorMessage 标志的切换,我似乎必须这样做,因为 update_error 在控制器之外(必须有一个简单的修复方法,但我还有其他鱼要炒)。这行得通,但我想这不是正统的。 $sce 可能有更好的方法(稍后会炒)。

【讨论】:

以上是关于Django 和 AngularJS:如何显示来自 Django 调试错误消息的 Angular $http 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在angularjs中通过ajax显示来自url的json数组

Django:如何根据表单中的选定选项在模板上显示来自 django 数据库的图像?

如何在 Django 中从用户模型的字段自动填充和显示数据到来自不同应用程序的另一个模型?

如何在 React 中显示来自 django-rest-framework 的错误消息

如何使用 Django 和 AngularJS 创建 POST 请求(包括 CSRF 令牌)

如何在 django 中显示来自 chartjs 视图的数据?