如何使用javascript在脚本文件或views.py中运行python函数以避免加载页面

如何使用javascript在脚本文件或views.py中运行python函数以避免加载页面,javascript,python,django,django-forms,Javascript,Python,Django,Django Forms,我有一个Django页面,它有一个表单,该表单有一个按钮,可以调用views.py中的函数,但是我想通过运行python脚本函数(在views.py中,或者我可以在另一个文件中分离该函数)来验证表单的一些输入文本,但我不想加载该页面。在哪里以及如何生成js代码来运行此函数 为视图函数创建一个新的url,该函数将验证输入 path('ajax/validate_input/', views.ValidateInput.as_view(), name='my_ajax_url'), 在views.

我有一个Django页面,它有一个表单,该表单有一个按钮,可以调用views.py中的函数,但是我想通过运行python脚本函数(在views.py中,或者我可以在另一个文件中分离该函数)来验证表单的一些输入文本,但我不想加载该页面。在哪里以及如何生成js代码来运行此函数

为视图函数创建一个新的url,该函数将验证输入

path('ajax/validate_input/', views.ValidateInput.as_view(), name='my_ajax_url'),
views.py
中进行验证,然后返回
JsonResponse

from django.views import View
from django.http import JsonResponse

class ValidateInput(View):
    def post(self, request):
        # Do validation
        return JsonResponse({
            'valid': True,
            'message': 'Invalid Characters',
        })
现在,在模板中编写js代码,向该url发出ajax请求

根据收到的响应,使用js对网页进行更改,以确保ajax的成功

// add jQuery
// put the code below inside an event handle, maybe on input change
$.ajax({
    url: {% url 'my_ajax_url' %},
    method: 'POST',
    data: {
        body: body,
        csrfmiddlewaretoken: '{{ csrf_token }}'
    },
    dataType: 'json',
    success: function(data){ 
        console.log(data.valid);
        console.log(data.message);
        // do stuff to change your webpage here
    }
});

我建议在输入更改时验证输入,但如果您想从提交中验证输入,请为表单提交添加一个事件处理程序。这里使用
event.preventDeafault
阻止表单提交,然后执行ajax操作,并根据收到的json执行其他操作。如果
valid=true
则继续,或者如果
valid=false
则在输入框下方显示以json接收的消息。

您可以在专用Python视图中呈现表单,并通过Javascript中的Ajax调用它

在此视图中,您应该:

  • 创建表单
  • 将其渲染为字符串
  • 将呈现形式返回为json
如果通过GET方法调用它,则使用初始值呈现表单(没有警告或错误消息)

如果使用的方法是POST,则从请求中获取值并呈现表单(包括验证消息)

Django视图可能是这样的:

import json
from django.http import HttpResponse
from django.template.loader import render_to_string

def my_view(request):

    if request.method == "GET":    
        form = MyForm()
    elif request.method == "POST":
        form = MyForm(data=request.POST)

    form_context = {'form': form}    
    form_html = render_to_string('form.html', form_context)

    json_response = json.dumps(form_html, separators=(',', ':'))
    return HttpResponse(json_response)
在Javascript端,通过GET(使用JQuery.getJSON):

并通过POST在Javascript端(使用JQuery.POST):

您可以查看、、文档页面以了解更多信息

$.getJSON('/url/path/to/my-view',
          function(data) {
              var form_html = decodeURIComponent(data.form);
              $("form#my-form-css-selector").html(form_html);
});
$.post('/url/path/to/my-view',
       $("form#my-form-css-selector").serialize(),
       function(data) {
           var form_html = decodeURIComponent(data.form);
           $("form#my-form-css-selector").html(form_html);
       },
       "json"
);