【问题标题】:Restangular with django rest framework and status of 400Restangular与django rest框架和400状态
【发布时间】:2016-01-10 05:53:00
【问题描述】:

我在 Django 中创建新用户,但是当我尝试使用现有电子邮件添加用户时,我得到 400 状态和

{
    "email": ["This field must be unique."]
}

并在控制台中得到了这个: 我将此配置用于 Angular 和 Django

app.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
}]);
app.config(function ($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
});

这就是我尝试在 POST 上处理此错误的方式

var users = Restangular.all('users');
        users.post({
            email: $scope.email,
            first_name: $scope.firstname,
            last_name: $scope.lastname,
            phone: $scope.phone,
            password: $scope.password
        }).then(function(response){
            console.log(response);
            alert("done");
        },function(response) {
            console.log("Error with status code", response.status);
        });

版本:

Django==1.8.4
djangorestframework==3.2.4
"angular": "1.4.7",
"restangular": "1.5.1"

有什么想法吗? 更新 模型序列化器:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = PUser
    def create(self, validated_data):
        user = PUser(
            email=validated_data['email'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],
            phone=validated_data['phone']
        )
        user.set_password(validated_data['password'])
        user.save()
        return user

PUser 模型是 Django AbstractUser 的副本,但没有用户名和电子邮件是必需的并且是唯一的

【问题讨论】:

  • 请发布您的序列化程序。
  • 您要更新现有用户吗? POST 用于创建,而不是更新。错误是User 的 Django 模型定义中的数据库约束。不能有 2 个用户使用相同的电子邮件地址。
  • 用模型更新了帖子。我正在创建新用户并且一切正常,但是当电子邮件已经使用时我需要处理错误
  • 建议您在尝试插入并返回更有意义的响应之前进行检查
  • 仅通过检查打印屏幕 - 您是否在 index.html 的脚本部分的开头包含了 lodash?

标签: angularjs django python-3.x django-rest-framework restangular


【解决方案1】:

通过检查传递给then 回调注册函数的第二个函数中的响应来处理 400 错误。这第二个参数是错误处理回调函数:

users.post({[...]}).then(
    // success server response handler
    function(response){
        console.log(response);
        alert("done");
    },
    // failure/error server response handler
    function(response) {
        // debugger;  // breakpoint for observing error responses
        if (response.data['email'] === 'This field must be unique.']) {
            // handle the duplicate email issue
            // e.g. display a warning, or a popover, or whatever.
        } else {
            console.log("Error with status code", response.status);
        }
    });

如果数据与上面的不完全一样,则检查确切的错误:

  • 打开调试器(ctrl + shift + j in chrome)
  • 取消注释上面的debugger;
  • 重新加载页面
  • 向新用户POST 发送电子邮件地址重复的请求
  • 在调试器中检查服务器的响应

相应地调整错误响应。

【讨论】:

    【解决方案2】:

    答案就在附近……原因在于 lodash 包,但不是标准包。 我通过 npm 使用 "lodash-custom-restangular": "0.0.5" 和 restangular 工作得很好......除了这种奇怪的行为。 我已经用 bower 下载了 lodash,并且所有工作都按预期进行。 谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-21
      • 2018-08-20
      • 2014-09-22
      • 1970-01-01
      • 2014-01-14
      • 2020-06-06
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多