【问题标题】:Django AJAX form, no POST data in viewDjango AJAX 表单,视图中没有 POST 数据
【发布时间】:2015-02-03 16:38:36
【问题描述】:

我有一些联系表格和 JS/Angular 代码将其发送以进行验证和邮寄。

contact_form.js

(function() {
var app = angular.module('contactForm', []);

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

app.controller('contactFormController', ['$http', '$scope', function($http, $scope){
    $scope.contact_form = {};
    this.send = function(form){
        if (form.$valid){
            $http.post('/contact_form_submit/', {'form': $scope.contact_form}).
            success(function(data, status, headers, config) {
                if (data.status == 1) {
                    $scope.msg = 'Twoja wiadomość została wysłana.';
                    $scope.contact_form = {};
                    $scope.contactForm.$setPristine();
                }
                else if (data.status == 'delay')
                    $scope.msg = 'Odczekaj.';
            }).
            error(function(data, status, headers, config) {
                $scope.msg = 'Wystąpił błąd.';
                if (status == '403')
                    $scope.msg += ' Włącz cookie!';
            });
        }
        else
            this.msg = 'invalid!';
    };
}]);
})();

view.py

def contact_form_submit(request):
return return_json(request)
if not request.is_ajax() or (request.method != 'POST'):
    raise SuspiciousOperation

response_data = {}

# dealing with existing (or not) delay entry
try:
    if request.session['mailer_delay'] > str(timezone.now()):
        response_data['status'] = 'delay'
        return return_json(response_data)
except KeyError:
    pass

# validation
form_data = {}
for field in ['name', 'email', 'phone', 'subject', 'text']:
    form_data[field] = request.POST.items()

# mailing
mailer = send_mail('Subject here', 'Here is the message.', 'from@example.com',
['to@example.com'], fail_silently=False)
request.session['mailer_delay'] = str(timezone.now()+timedelta(seconds=60))  

response_data['status'] = mailer
return return_json(response_data)

return_json()

def return_json(data):
    from django.http import HttpResponse
    import json
    return HttpResponse(json.dumps(data), content_type="application/json")

问题是我在 request.POST 中看不到任何项目。 Firebugs 告诉我数据已正确发送,但看不到。 有谁知道怎么回事?

【问题讨论】:

  • return return_json(request) 为什么在视图的第二行需要这一行?
  • 哦,对不起,我忘了提。这只是一些捷径。我已经编辑了我的问题,添加了那个代码。第二行用于测试,我尝试获取该 POST 数据,但不幸的是它们不存在。
  • 是的,我想。我真正的意思是为什么在让逻辑运行之前返回整个请求对象?

标签: ajax django angularjs post


【解决方案1】:

好的,我明白了。所有数据都在request.body,而不是request.POST。 谁能解释为什么?我已经阅读了文档,但对我来说仍然不清楚。

【讨论】:

  • 因为您发送的是 JSON,而不是表单编码的数据。
猜你喜欢
  • 2016-08-11
  • 2017-11-16
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 2013-02-25
  • 2021-09-13
  • 2015-11-25
  • 2021-07-29
相关资源
最近更新 更多