Django后端比前端发送的少一个param

时间:2015-05-17 20:19:22

标签: django angularjs rest

我有一个小型的Web应用程序,后面有AngularJS前端和Django ReST。当我向Web服务发出POST请求时,发生了一个奇怪的故障:浏览器控制台清楚地显示了3个正在发送的参数,但后端日志记录仅报告了2个参数。结果是服务器因数据库查找错误而抛出代码500错误。

以下是代码:

客户端

        var b = newQuesForm.username.value;
        $http.post('/myapp/questions/new', {username:b,title:q.title,description:q.description}).
          success(function(data, status, headers, config) {
              $http.get('/myapp/questions').success(function(data){
                    $scope.questions = data;
                    q = null;
                    $scope.newQuesForm.$setPristine();
                }).error(function(data, status, headers, config) {
                    console.log(headers+data);
                  });
          }).
          error(function(data, status, headers, config) {
            console.log(headers+data);
          });

我的手动日志记录和开发控制台都显示如下字符串:

{"username":"admin","description":"What's your name?","title":"question 1"}

服务器

class CreateQuestionSerializer(serializers.Serializer):
    author = UserSerializer(required=False)
    title = serializers.CharField(max_length=150)
    description = serializers.CharField(max_length=350)

    def create(self, data):
        q= Question()
        d = data
        q.title = d.get('title')
        q.description = d.get("description")
        q.author = User.objects.get(username=d.get('username'))
        q.save()
        return q

服务器端日志记录显示username参数永远不会成功进行,因此我最终得到代码500和错误消息:

User matching query does not exist.(没有id = none的用户)

导致某些数据丢失的原因是什么?

1 个答案:

答案 0 :(得分:0)

事实证明问题实际上是字段的序列化,正如@nikhiln开始指出的那样。我跟着他的导致重构代码,将create()方法移动到api.py而不是serializers.py,并停止完全依赖客户端数据来获取用户的身份,这有点愚蠢第一个地方(在视图中将User传递给隐藏的input,然后从那里获取用户名并将其传回AJAX参数中的服务器)。这是新代码,完美运行:

class QuestionCreate(generics.CreateAPIView):
    model = Question
    serializer_class = CreateQuestionSerializer

    def create(self, request,*args,**kwargs):
        q= Question()
        d = request.data
        q.title = d.get('title')
        q.description = d.get("description")
        q.author = request.user
        q.save()
        if q.pk:
            return Response({'id':q.pk,'author':q.author.username}, status=status.HTTP_201_CREATED)
        return Response({'error':'record not created'}, status=status.HTTP_400_BAD_REQUEST)

所以在这里,我是以正确的方式做到的:直接从后端的User param中提取request