Пытаюсь найти хороший пример создания html-кнопки в django для запуска функции python и отображения результата

Я уже некоторое время пытаюсь изучить django в основном ради собственного любопытства. Моя текущая цель - иметь кнопку на экране, которая при нажатии выполняет какую-то простую функцию на python. Что-то вроде отображения строкового значения или случайного числа на экране. Я нашел несколько примеров, но они не помогают мне понять проблему. Большинство примеров были построены как кнопки или что-то подобное.

Я пытался изучить вызовы ajax для python, но я не могу найти статьи, которые помогут мне с основами, и все видеоуроки, которые я нахожу по этой теме, имеют языковой барьер, который не помогает мне учиться. Извините, что задаю, возможно, элементарный вопрос.

Вот базовый пример нажатия кнопки и получения случайного числа обратно. Я использовал JQuery, потому что считаю его в целом более простым и быстрым, так что примите это во внимание.

Обычно, когда вы используете Ajax, вы кодируете возвращаемые данные в JSON, так что это то, что я сделал.
Я использовал словарь в качестве возвращаемого JSON и добавил свои обычные ключи, а именно:

  1. status возвращать значение True/False, чтобы показать, все ли прошло хорошо или нет
  2. msg общее сообщение, в основном для сообщений об ошибках
  3. Дополнительные ключи для возвращаемых данных

шаблон (html)

{% csrf_token %}
<h3 id="myheader"></h3>
<button id="mybutton">Click Me</button>

Jquery/Ajax (javascript)

  • Я привел как пример POST, так и GET... Обычно я всегда использую POST, потому что я отправляю дополнительные данные, такие как: 'дайте мне имя пользователя для человека с этим именем'
  • .
// Post Example (If you wanted to send DATA as well)
function ajaxPost(){
    //  if POSTing data, this: {% csrf_token %} must be in the template somewhere
    //                                ^ (it's hidden)
    submitData = {
        'istest': True,
        'csrfmiddlewaretoken': $('[name=csrfmiddlewaretoken]').val()
    };

    $.ajax({
        method: 'post',
        url: 'myviewurl',
        data: submitData,
        success: function(data){
            console.log(data);
            if (data['status']){
                // everything went good
                console.log(data['msg']);
                console.log(data['my_return_data']);

                // do something with returned data
                $('#myheader').html('Returned: ' + data['my_return_data']);

            }else{
                // something went bad
                console.log(data['msg']);
            };
        },
        error: function(event,xhr,settings,errorText){
            console.log('Something Broke')
            // xhr.status , common error table
            // 0    = Server didn't Reply (Server Down)
            // 400  = Bad Request         (Syntax Error)
            // 403  = Forbidden           (Login Token Expired)
            // 403  = Not Found           (Invalid Url)
            // 500  = Server Error        (Django Crash)
        },
    });
};

// GET Example
function ajaxPost(){
    $.ajax({
        method: 'get',
        url: 'myviewurl',
        success: function(data){
            console.log(data);
            if (data['status']){
                // everything went good
                console.log(data['msg']);
                console.log(data['my_return_data']);

                // do something with returned data
                $('#myheader').html('Returned: ' + data['my_return_data']);
            }else{
                // something went bad
                console.log(data['msg']);
            };
        },
        error: function(event,xhr,settings,errorText){
            console.log('Something Broke')
        },
    });
};

$(document).ready(function() {
    $('#mybutton').click(function(){
        // on button click run ajax post

        // run the POST example
        ajaxPost();
    });
});

view.py

from django.http import HttpResponse
import json

def MyView(request):
    # we just assume it won't work / True = good / false = bad
    returnData = {'status':False}

    if request.method == 'POST':
        # Get Data from post
        testbool = request.POST.get('istest')

        if testbool:
            # do python things

            from random import randrange
            data['my_return_data'] = randrange(10)

            data['status'] = True # everything worked!
            data['msg'] = 'Ran Python Code With a POST!'
        else:
            data['msg'] = 'istest needs to be True'

    else:
        # a GET

        # Do some python stuff
        from random import randrange
        data['my_return_data'] = randrange(10)

        data['status'] = True # everything worked!
        data['msg'] = 'Ran Python Code With a GET!'

    # Return the Data in Json so Javascript can easily use it
    return HttpResponse(
        json.dumps(data),
        content_type="application/json"
    )

Небольшое замечание о JSON Некоторые вещи не могут быть помещены в Json, например, десятичные поля Django... поэтому вам нужно преобразовать их в тип, приемлемый для Json - как в примере с десятичной дробью, просто сделайте ее Float
. Если есть вопросы, дайте мне знать. Честно говоря, лучше всего просто поиграть с этим, и вы поймете, что к чему

Вернуться на верх