Как я могу запустить функцию Python в файле сценария или в views.py, используя JavaScript, чтобы не загружать страницу - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть страница Django, в которой есть форма, в которой есть кнопка, которая вызывает функции в views.py, но я хочу проверить некоторый входной текст формы с помощью функции скрипта python (в views.py или могуотделить эту функцию в другом файле) но я не хочу загружать страницу.где и как я могу сделать JS-код для запуска этой функции?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете визуализировать форму в выделенном представлении Python и вызывать ее через Ajax из Javascript.

В этом представлении вы должны:

  • создать форму
  • отобразить ее в строку
  • вернуть обработанную форму как 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):

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

А на стороне Javascript через POST (используя JQuery.post):

$.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"
);

Вы можетеcheck Django views , Django render_to_string , JQuery.getJSON , JQuery.post страницы документа для получения дополнительной информации.

0 голосов
/ 21 сентября 2018

Создать новый 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-код, который будет отправлять ajax-запросы на этот URL-адрес.

В соответствии с полученным ответом внесите изменения в свою веб-страницу, используя 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, ниже поля ввода.

...