【问题标题】:How to Display Django form errors using AngularJS?如何使用 AngularJS 显示 Django 表单错误?
【发布时间】:2015-08-11 19:02:39
【问题描述】:

我正在使用内置的 Django 用户模型。这是我的 serializers.py:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username', 'password', 'email', )

这是我的看法:

class HomePageView(TemplateView):
    template_name = "home.html"

    def get_context_data(self, **kwargs):
            context = super(HomePageView, self).get_context_data(**kwargs)
            return context

class user_list(APIView): #called when I go to the /CMS/users URL 
    """
    List all users, or create a new user.
    """
    serializer_class = UserSerializer
    def get(self, request):
        users = User.objects.all()
        serializer = UserSerializer(users, many=True)
        return Response(serializer.data)

    def post(self, request):
        serializer = UserSerializer(data=request.DATA)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这是 home.html:

<html ng-app="notesApp">
<body ng-controller="MainCtrl as ctrl">
        <form ng-submit="ctrl.add()" name="myForm">
            <label>Username</label>
            <input type="text" name="uname" ng-model="ctrl.user.username" required> 

            <label>Password</label>
            <input type="password" name="pwd" ng-model="ctrl.user.password" required>

            <label>Email</label>
            <input type="email" name="mail" ng-model="ctrl.user.email" required> 

        <input type="submit" value="Submit" ng-disabled="myForm.$invalid"> 
        </form>
    </div>

这是 JS:

angular.module("notesApp", [])
    .controller("MainCtrl", ["$http", function($http) {
    var self = this;
    self.users = {}
    var fetchUsers = function() {
        // the line below gets the list of all users
        return $http.get("/CMS/users").then(function(response) {
        self.users = response.data;
        }, function(errResponse) {
        console.error("Error while fetching users.");
        });
    };

    fetchUsers();

    self.add = function() {
        $http.post("/CMS/users", self.user).then(fetchUsers);
        console.log("User clicked submit with ", self.user);
    };
    }]);

我使用了表单并成功创建了一个用户(我使用了有效的用户名、电子邮件和密码)。我尝试使用已经存在的用户名重新创建用户。当我单击表单上的“提交”按钮时,它在日志中返回 400 错误(如预期的那样),因为如果用户名已经存在,Django 不允许创建新用户。现在,django.admin.models.AbstractModel 返回一个错误,指出用户名已经存在:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username, password and email are required. Other fields are optional.
    """
    username = models.CharField(_('username'), max_length=30, unique=True,
        help_text=_('Required. 30 characters or fewer. Letters, digits and '
                    '@/./+/-/_ only.'),
        validators=[
            validators.RegexValidator(r'^[\w.@+-]+$',
                                      _('Enter a valid username. '
                                        'This value may contain only letters, numbers '
                                        'and @/./+/-/_ characters.'), 'invalid'),
        ],
        error_messages={
            'unique': _("A user with that username already exists."),
        })

有没有办法让我在前端使用 AngularJS 显示“具有该用户名的用户已存在”?

编辑: 我将 self.add() 函数更改为:

self.add = function() {
    $http.post("/CMS/users", self.user)
    .error(function(data, status, headers, config) {
        console.log(data);
     })
    .then(fetchUsers);
};

然后当我尝试使用已经存在的用户名创建用户时,会记录下来:

Object {username: Array[1]}
   username: Array[1]
     0: "This field must be unique."
     length: 1
     __proto__: Array[0]
  __proto__: Object

【问题讨论】:

    标签: angularjs django validation django-forms


    【解决方案1】:
    $http.post("/CMS/users", self.user).then(fetchUsers).catch(function(response){
      //here you can manipulate the response from the server and display the message
    });
    

    实际上.. 根据$http 的文档,您应该处理:

    .error(function(data, status, headers, config) {
      // called asynchronously if an error occurs
      // or server returns response with an error status.
     })
    

    以下问题的答案是视情况而定。 如果结果总是类似:{property:[]} 那么你可以这样做:

    for(prop in data){
      if(data.hasOwnProperty(prop)){
         var messages = data[prop];
         // now you have the messages array and you can display them.
      }
    }
    

    否则,如果结果不同,您将无法处理每种情况。

    编辑:

    使用 hasOwnProperty 是确保我们没有从原型继承链中获取属性的最佳实践:more details - 基本上确保您没有获取继承的属性

    【讨论】:

    • 我所做的是: self.add = function() { $http.post("/CMS/users", self.user).error(function(data, status, headers, config) { console.log(data); }).then(fetchUsers);};现在,当我尝试使用已经存在的用户名创建用户时,会记录下来: Object {username: Array[1]}... 所以它确实返回了错误消息。我有什么办法可以通用地访问实际的错误消息吗?我的意思是,有时错误可能是:{username: Array[1]},有时可能是:{email:Array[1]}。有没有办法让我访问字符串列表中的所有实际错误消息?
    • 我已更新我的问题(请参阅问题底部的“编辑”部分)。事实证明,不是 Django 传递“具有该用户名的用户已经存在”。到前端,它传递“这个字段必须是唯一的”。我不确定 Django 从哪里得到“这个字段必须是唯一的”。 string from 但我希望我可以将其更改为“具有该用户名的用户已存在。请尝试不同的用户名。”或类似的东西。
    • @sirocco 忽略我上面的评论,我想我应该问一个全新的问题,因为您的回答确实回答了最初的问题。顺便说一句,为什么我们需要“if(data.hasOwnProperty(prop))”语句?既然我们已经在迭代“for (prop in data)”,那么 data.hasOwnProperty(prop) 不就是真的吗?
    • 我更新了关于 hasOwnProperty 的答案 - 我对 Django 不够熟悉,无法帮助解决另一个问题 :)
    猜你喜欢
    • 2017-09-03
    • 2016-10-07
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2013-12-15
    • 2011-02-01
    相关资源
    最近更新 更多