【问题标题】:Post and get in a same jquery request发布和获取相同的 jquery 请求
【发布时间】:2012-12-07 00:10:44
【问题描述】:

在我的 Django 应用程序中,我希望能够发布和获取相同的 jQuery 请求。

我的 HTML:

    <form  method="post" id='validation_form'>
    {% csrf_token %}
        <input id='username' type="text" name="username" value=""/>
        <button type="submit">Submit</button>
    </form>

JS:

   var username = $('#username').val()
   $.post('/auth_validate', {'username': username}, function(data) { 
   // Get Request to get something.
   }

观看次数:

   def auth_validate(request):
       error = False
       if request.method == 'POST':
           username = request.POST.get('username')

           if User.objects.filter(username__exact=username).exists():
               error = 'Sorry this username is already taken'

我想在我以前发布的同一个 jQuery 请求中得到“错误”。有可能吗?

感谢您的帮助。

编辑:这是我找到的解决方案。

JS:

  function validateForm() {
    var username = $('#username').val()
    var result=''
    $.get('/auth_validate_username/', {'result':result}, function(data){
       $.post('/auth_validate_username/', {'username': username}, function(data) { 
       $('#error_message').html(data); 
      });
    });
    return false;
    };

html:

   <form  method="post" onsubmit="return validateForm();">
    {% csrf_token %}
        <input id='username' type="text" name="username" value=""/>
        <div id='error_message'></div>
        <button type="submit">Submit</button>
    </form>

观看次数:

    def auth_validate_username(request):
       result = ''
       if request.method == 'POST':
          username = request.POST.get('username')
          if User.objects.filter(username=username):
             result='Sorry but this name is already taken'

    return HttpResponse(result)

这样我首先发布值用户名。如果用户名已经存在结果更改,然后我得到它。

诀窍是将发布请求放入获取请求中。

【问题讨论】:

  • 您的视图中有语法错误,但这可能只是复制和粘贴问题,对吧?
  • 是的。我更正了。
  • 您可以返回一个JSON 响应,其中包括状态(“一切正常”或“错误”)和错误消息(“用户名已被占用”、“用户名太短/太长”.. .)
  • 我不太明白。是否要通过 POST 向服务器发送一些信息并以 Sorry this username is already taken 返回客户端?
  • @Marcolac:那么您的标题完全具有误导性。您有一个请求(后请求),并且您正在询问如何从服务器获取答案。我不知道 Django 中的响应对象是什么样的,但它必须看起来像 response.send('Sorry. Error')。为了获得响应,Dolondro 提出了一个非常标准且很好的解决方案。

标签: javascript jquery ajax django


【解决方案1】:

不要使用 $.post,而是使用 $.ajax 命令。它们做的事情完全相同,但 $.ajax 为您提供了更多功能。

$.ajax({
  type: 'POST',
  url: "/auth_validate",
  data: {
    'username': username
  },
  success: function(data){
    //There was successfully data here!
  },
  error: function(xhr, data, error){
    //An error was thrown!
  }
});

然后在此行上方添加一行将返回 403(或类似)HTTP 错误代码(我会提供它,但我不熟悉 Django 的来龙去脉):

error = 'Sorry this username is already taken'

这样,您的成功消息将通过成功处理程序进行路由,您的错误将通过错误处理程序进行路由。

【讨论】:

  • 这正是 OP 所要求的。
【解决方案2】:

您可以返回一个 http 代码 400(错误请求)并为您添加一个错误处理程序 post 请求,这应该可以解决问题。

我对 django 不是很熟悉,所以我只是给你一个抽象的想法。

【讨论】:

  • 为非错误返回 HTTP 500 会在 Django 中为您提供大量电子邮件错误报告。
  • @Thomas Orozco:是的,400 似乎更合适。我的错。
【解决方案3】:

如果 get 是指GET 方法,为什么不直接在 url 参数中添加查询?

  var username = $('#username').val()
   $.post('/auth_validate?myvar=thevalue', {'username': username}, function(data) { 
   // Get Request to get something.
   }

但也许我误解了这个问题......

【讨论】:

    【解决方案4】:

    我认为你应该看看the dajaxAPI。这样就可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2016-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多