javascript - 如何在单个 Django View 中进行两个或多个 AJAX 调用

标签 javascript python html django ajax

我正在开发个人支出日记,但遇到了问题。

为了更好的用户体验,我需要在不重新加载页面的情况下添加新项目。

我制作了单个 ajax 表单,但我需要两个 .

我花了三天时间尝试解决这个问题。

有人有什么建议吗?

这是我的

forms.py

     class AddIncome(forms.ModelForm):
        class Meta:
            model = Income
            fields = ( 'title','value',)    

    class AddExpence(forms.ModelForm):
        class Meta:
            model = Expence
            fields = ( 'title_exp','value_exp',)

这里已满

views.py



    def dashboard(request):
    if request.method == 'POST':
        if request.is_ajax():
            addincome = AddIncome(request.POST)
            if addincome.is_valid():
                addincome.cleaned_data
                addincome.save()
                latest = Income.objects.latest('id').id
                income_object = model_to_dict(Income.objects.get(pk=latest))
                return JsonResponse({'error': False, 'data': income_object})
            else:
                print(addincome.errors)
                return JsonResponse({'error': True, 'data': addincome.errors})
        else:
            error = {
                'message': 'Error, must be an Ajax call.'
            }
            return JsonResponse(error, content_type="application/json")

    if request.method == 'POST':
        if request.is_ajax():
            addexpence = AddExpence(request.POST)
            if addexpence.is_valid():
                addexpence.cleaned_data
                addexpence.save()
                latest = Expence.objects.latest('id').id
                expence_object = model_to_dict(Expence.objects.get(pk=latest))
                return JsonResponse({'error': False, 'data': expence_object})
            else:
                print(addexpence.errors)
                return JsonResponse({'error': True, 'data': addexpence.errors})
        else:
            error = {
                'message': 'Error, must be an Ajax call.'
            }
            return JsonResponse(error, content_type="application/json")
    else:
        addincome = AddIncome()
        addexpence = AddExpence()
        income = Income.objects.order_by('-date').filter(is_published=True)
        expence = Expence.objects.order_by('-date').filter(is_published=True)   
        data = {
            'addincome_html': addincome,
            'addexpence_html': addexpence,
            'income':income,
            'expence':expence
        }

        return render(request, template_name='main/dashboard.html', context=data)

这里是 页面表单

    <form  method="POST" name="create_incomefrm" id="create_incomefrm" action="{% url 'create_income_record' %}">
            {% csrf_token %}
            {{ addincome_html.as_p }
            <button type="submit" id="popup-button-2" class="dashboard__popup-button" 
           name="createincomefrmbtn">Add <span>&rarr;</span></button>    
     </form>



     <form  method="POST" name="create_expencefrm" id="create_expencefrm" action="{% url 'create_expence_record' %}">
                {% csrf_token %}
            <div class="dashboard__popup-2" id="dashboardpopup-4">       
                {{ addexpence_html.as_p }}  
    <button id="popup-button-3" name="createexpencefrmbtn" class="dashboard__popup-button">Add<span>&rarr;</span></button>    
  </form>

这里是
ajax 表单

     $('#create_incomefrm').submit(function (e) {
        e.preventDefault();
        var formData = {
            'title': $('#id_title').val(),
            'value': $('#id_value').val(),
            csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
            contentType: 'application/x-www-form-urlencoded',
            encode: true,
        };
        $.ajax({
            type: 'POST',
            url: 'create/',
            data: formData,
            dataType: 'json',
        }).done(function (data) {
           //code
          });
        });


     $('#create_expencefrm').submit(function (e) {
        e.preventDefault();
        var formData = {
            'title_exp': $('#id_title_exp').val(),
            'value_exp': $('#id_value_exp').val(),
            csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
            contentType: 'application/x-www-form-urlencoded',
            encode: true,
        };
        $.ajax({
            type: 'POST',
            url: 'create_exp/',
            data: formData,
            dataType: 'json',
        }).done(function (data) {
            //code
          });
        });

最佳答案

解决方案

为具有相同名称/ID 的两个表单创建一个隐藏的输入。例如HTML

<!--form-1-->
<input type='hidden' name='form_type' value='income'>

<!--form-2-->
<input type='hidden' name='form_type' value='expense'>

相应地更新 JavaScript

然后在您的 View 中捕获每个表单 -

# form-1
if request.method == 'POST' and request.POST['form_type'] == 'income':
    # rest of your code

# form-2
if request.method == 'POST' and request.POST['form_type'] == 'expense':
    # rest of your code

关于javascript - 如何在单个 Django View 中进行两个或多个 AJAX 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60159327/

相关文章:

javascript - 启用基于单选按钮选择的组合框

javascript - jQuery 取消绑定(bind),恢复绑定(bind)

javascript - jQuery slideToggle 仅适用于一个 div,不适用于其他

javascript - 带有 keyup 和按钮的 parseInt

javascript - 处理单个页面上的多个 Ckeditor 实例

python - 如果 robots.txt 允许所有内容并不允许所有内容,这意味着什么?

python - 如何通过数据包嗅探来记录浏览历史?

javascript - 我只能获取一个属性的值

python - 小型物联网设备数据库

css - 侧边菜单 div 高度不随主 div 延伸