【问题标题】:Django ajax post method dont redirectDjango ajax post方法不重定向
【发布时间】:2021-03-31 15:51:22
【问题描述】:

我正在关注关于 ajax 如何在 Django 上工作的教程,这是我第一次使用 ajax,我遇到了一个小问题,数据插入正在工作,但成功的 ajax 并没有正确重定向,谢谢你的帮助 这是代码

views.py:

class exo(View):
def get(self, request):


    form = ExerciseForm()
    tasks = task.objects.all()
    context = {
                   'form': form,
                   'tasks': tasks
                   }
    return render(request, 'coach/test.html', 
    context=context)

def post(self, request):

    form = ExerciseForm()
    if request.method == 'POST':
        form = ExerciseForm(request.POST)
        print(form)

        if form.is_valid():
            print('adding task', form)
            new_exrercise = form.save()
            return JsonResponse({'task': model_to_dict(new_exrercise)}, status=200 )
        else:
            print('not adding task')
            return redirect('exo')

ajax 函数:

$(document).ready(function(){

$("#addExercise").click(function() {
    var serializedData = $("#TaskForm").serialize();

    $.ajax({ 
               url: $("TaskForm").data('url'),
               data : serializedData,
               type: 'post',
               success: function(response) {
                    $("#taskList").append('<div 
class="card"><div class="card-body">'+ response.task.name 
+'<button type="button" class="close float-right"> <span 
aria-hidden="true">&times;</span></button></div></div>');
                    
               }
           })
  });

});

html内容:

 <form class="submit-form" method="post" id="TaskForm" 
data-url="{% url 'session' %}">
    {% csrf_token %}
    <div class="form-group">
    {% for field in form %}
    <div style="margin-bottom: 2rem;"></div>
    

        {{field}}
    
    
    {%  endfor %}
    <div style="margin-bottom: 2rem;"></div>
    <button type="submit" class="btn btn-success dropdown-toggle " id="addExercise">Confirm</button>
    </div>
</form>

这就是我得到的(我得到一个对象,没有别的) output image

当我回到页面 exo 时,插入完成 控制台向我显示帖子发送良好: [21/Dec/2020 22:25:38]“POST /coach/exo/HTTP/1.1”200 43

【问题讨论】:

  • 您的 addExercise 按钮将首先提交表单,因为该表单意味着您发出 POST 请求并因此加载新页面,它永远不会 执行 AJAX 请求,您应该将 &lt;button type=""&gt; 更改为只是一个通用按钮,因此删除 type="submit"
  • 谢谢,我做到了,它不再发布了,直到我从一个视图切换到一个我不知道为什么的功能,但它现在运行良好

标签: json django ajax redirect post


【解决方案1】:

问题是你的按钮:

&lt;button <b>type="submit"</b> class="btn btn-success dropdown-toggle " id="addExercise"&gt;Confirm&lt;/button&gt;

提交表单,而不是(仅)通过 AJAX 调用,而只是通过您将其设为提交按钮这一事实。因此,这意味着浏览器将对表单进行编码并使用该表单发出 POST 请求,然后浏览器将呈现响应。

因此,您应该从按钮中删除 type="submit" 部分:

&lt;button class="btn btn-success dropdown-toggle " id="addExercise"&gt;Confirm&lt;/button&gt;

【讨论】:

    【解决方案2】:

    我删除了提交类型,但没有任何工作,按钮没有向 ajax 发布任何内容,然后我将视图类切换为函数,它工作我真的不知道为什么会有视图

    def addsession(request):
    
        template = loader.get_template('coach/addexercise.html')
        exercises = exercise.objects.all()
        # context = {'exercises': exercises}
        UpperBody = exercise.objects.filter(category__name="Upper Body")
        LowerBody = exercise.objects.filter(category__name="Lower Body")
        FIIT = exercise.objects.filter(category__name="FIIT")
        LIIT = exercise.objects.filter(category__name="LIIT")
        form = ExerciseForm()
        tasks = task.objects.all()
        context = {'exercises': exercises,
                       'UpperBody': UpperBody,
                       'LowerBody': LowerBody,
                       'FIIT': FIIT,
                       'LIIT': LIIT,
                       'form': form,
                       'tasks': tasks
                       }
    
    
    
    
        form = ExerciseForm()
        if request.method == 'POST':
            form = ExerciseForm(request.POST)
            print(form)
    
            if form.is_valid():
                print('adding task', form)
                new_exrercise = form.save()
                return JsonResponse({'task': model_to_dict(new_exrercise)}, status=200 )
            else:
                print('not adding task')
                return redirect('session')
    
        return render(request, 'coach/addexercise.html', context=context)
    

    感谢你们的回答我真的没有注意按钮的输入类型

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 2014-08-07
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 2017-12-09
      • 2021-09-13
      • 1970-01-01
      • 2019-11-26
      相关资源
      最近更新 更多