当前位置: 首页 > 面试题库 >

Django Ajax表单提交错误地重定向到另一个页面

须景胜
2023-03-14
问题内容

当我使用ajax在Django中提交评论表单时,页面将重定向到空白页面,向我显示成功数据:

{"status":"success", "msg":"添加成功"}

,但不要停留在当前页面。我希望页面停留在当前页面并向我显示新评论。

这是我的update_comment视图:

def update_comment(request, news_pk):
    news = get_object_or_404(News, id=news_pk)
    comment_form = CommentForm(request.POST or None)
    if request.method == 'POST' and comment_form.is_valid():
        if not request.user.is_authenticated:
            return render(request, 'login.html', {})
        comments = comment_form.cleaned_data.get("comment")
        news_comment = NewsComments(user=request.user, comments=comments, news=news)
        news_comment.save()

    # return redirect(reverse('news:news_detail', kwargs={'news_pk': news.id}))
        return HttpResponse('{"status":"success", "msg":"添加成功"}', content_type='application/json')
    else:
        return HttpResponse('{"status":"fail", "msg":"添加失败"}', content_type='application/json')

这是我的ajax:

$(document).on('submit', 'comment_form', function(e){
        e.preventDefault();

        $.ajax({
            cache: false,
            type: "POST",
            url:"{% url 'operation:update_comment' news.id %}",
            data:{'news_pk':{{ news.id }}, 'comments':comments},
            async: true,
            beforeSend:function(xhr, settings){
                xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
            },
            success: function(data) {
                if(data.status == 'fail'){
                    if(data.msg == '用户未登录'){
                        window.location.href="login";
                    }else{
                        alert(data.msg)
                    }
                }else if(data.status == 'success'){
                    window.location.reload();//refresh current page.
                }

                },
        });
    });

这是我的表格:

<form id="comment_form" action="{%  url 'operation:update_comment' news.id %}" method="POST" >
{% csrf_token %}

<textarea id="comment_textarea"name="comment"></textarea>

<input type="submit" value="Submit"> </input>

</form>

问题答案:

终于我做到了!感谢上帝!非常兴奋!

我以前的代码中有三个主要问题。

首先:由于ajax会将news_pk发布到视图 update_comment
,所以我不需要在此视图的url和template(在<form>tag的url和ajax的url中)中添加news_pk
,所以我删除了它们或数据仍会通过Form,但不会通过Ajax。

第二:我的绑定不正确,我在表单上有单击处理程序,应该是提交处理程序。如果将其绑定到按钮,则可以使用单击处理程序。但是对于这一部分,我仍然有些困惑,在按钮顶峰方式和表单提交方式之间。

第三个问题是我误认为’comments’和’comment’。’comment’是的name属性<textarea>,forms.py通过该属性获取数据。

注释是由ajax定义的, var comments=$("#js-pl-textarea").val(),因此在视图中我需要使用comments = request.POST.get("comments", "")但不需要注释,这就是“发布失败”的原因。

以下是我的代码。

这是ajax:

 $("#comment_form").submit(function(){
        var comments = $("#js-pl-textarea").val()

        $.ajax({
            cache: false,
            type: "POST",
            url:"{% url 'operation:update_comment' %}",
            data:{'news_pk':{{ news.pk }}, 'comments':comments},
            async: true,
            beforeSend:function(xhr, settings){
                xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
            },
            success: function(data) {
                if(data.status == 'fail'){
                    if(data.msg == '用户未登录'){
                        window.location.href="login";
                    }else{
                        alert(data.msg)
                    }
                }else if(data.status == 'success'){
                    window.location.reload();//refresh current page.
                }

                },
        });
        return false;

    });

这是我的udate_comment视图:

@login_required
def update_comment(request):
        news_pk = request.POST.get("news_pk", 0)
        comments = request.POST.get("comments", "")
        if int(news_pk) > 0 and comments:
            news_comments = NewsComments()
            news = News.objects.get(id=int(news_pk))
            news_comments.news = news
            news_comments.comments = comments
            news_comments.user = request.user
            news_comments.save()
            return HttpResponse('{"status":"success", "msg":"添加成功"}', content_type='application/json')
        else:
            return HttpResponse('{"status":"fail", "msg":"添加失败"}', content_type='application/json')

这是模板中的表格:

<form id="comment_form" action="{%  url 'operation:update_comment'%}" method="POST" >
{% csrf_token %}

<textarea id="js-pl-textarea"name="comment"></textarea>

<input type="submit" value="Submit"> </input>

</form>

非常感谢大家的回覆!有了您的回覆,我逐步找出了这些问题!



 类似资料:
  • 问题内容: 我已经阅读了所有有关将标头插入php表单文件中以便在提交表单后将用户重定向到另一个URL的文章-但我不知道该怎么做。下面是我的代码。您能告诉我在哪里放置标题/重定向,以便通过电子邮件发送信息,然后用户转到另一个html页面吗? 问题答案: 之后 请注意,您将永远不会看到“感谢您订阅我们的邮件列表” 那应该在下一页上,如果您回显任何文本,则会收到错误消息,因为标头已经被创建;如果您要重定

  • 问题内容: 如何使用Wicket重定向到另一个页面?IIRC,必须在构造函数中引发一些异常,但我不记得是哪个异常。提前致谢。 问题答案: 就像您在自己的答案中指出的那样,投掷a 就能做到这一点,但这实际上是允许重定向并最终在当前页面继续进行的系统的一部分(通常是授权过程的一部分)。如果不是您的情况,但是您仍然必须执行一些中断处理的操作,则最好抛出。 我知道的主要用法是在“重定向到登录页面”过程中。

  • 问题内容: 如何使用jQuery或纯JavaScript将用户从一个页面重定向到另一页面? 问题答案: 一个不只是简单地使用jQuery进行重定向 jQuery不是必需的,[ ]它将最好模拟HTTP重定向。 比使用更好,因为它不会将原始页面保留在会话历史记录中,这意味着用户不会陷入永无休止的后退按钮惨败中。 如果要模拟某人单击链接,请使用 如果要模拟HTTP重定向,请使用 例如:

  • 表单提交成功后,页面不会重定向到感谢页面,在控制台上,我得到了错误响应,因为AMP4Email不支持重定向。请让我知道重定向功能何时工作。 我们正在使用 在Php中,我添加了重定向头

  • 问题内容: 我浏览了所有类似的帖子,但似乎无济于事。这就是我所拥有的 HTML: JavaScript / jQuery: 我无法做的是防止在按时刷新页面。我尽力尝试了每一个组合,包括内部。我也尝试使用和相反的相同结果。我无法解决这个问题,这真是疯了。由于某些设计原因,我尽可能使用超链接。非常感谢您的帮助。 问题答案: 像这样修改函数: 正如评论所提到的,通过事件: 更新2:

  • 早上好,我在一个测试AMP页面上有一个表单(是AMP验证),表单工作:我收到了带有结果的电子邮件(我使用一个php来处理它)。我不知道(我做了一些尝试,但我想我仍然错过了一个例子)让AMP页面正确响应的语法(现在我得到订阅失败!但我确实收到了电子邮件)或提交后重定向。这里我的例子: AMP带有表单的页面(我在提交后收到表单结果,但我不知道如何重定向或获得“订阅成功!”(信息) 带有表单的非AMP页