Пытаюсь найти хороший пример создания html-кнопки в django для запуска функции python и отображения результата
Я уже некоторое время пытаюсь изучить django в основном ради собственного любопытства. Моя текущая цель - иметь кнопку на экране, которая при нажатии выполняет какую-то простую функцию на python. Что-то вроде отображения строкового значения или случайного числа на экране. Я нашел несколько примеров, но они не помогают мне понять проблему. Большинство примеров были построены как кнопки или что-то подобное.
Я пытался изучить вызовы ajax для python, но я не могу найти статьи, которые помогут мне с основами, и все видеоуроки, которые я нахожу по этой теме, имеют языковой барьер, который не помогает мне учиться. Извините, что задаю, возможно, элементарный вопрос.
Вот базовый пример нажатия кнопки и получения случайного числа обратно. Я использовал JQuery, потому что считаю его в целом более простым и быстрым, так что примите это во внимание.
Обычно, когда вы используете Ajax, вы кодируете возвращаемые данные в JSON, так что это то, что я сделал.
Я использовал словарь в качестве возвращаемого JSON и добавил свои обычные ключи, а именно:
status
возвращать значение True/False, чтобы показать, все ли прошло хорошо или нетmsg
общее сообщение, в основном для сообщений об ошибках- Дополнительные ключи для возвращаемых данных
шаблон (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
.
Если есть вопросы, дайте мне знать. Честно говоря, лучше всего просто поиграть с этим, и вы поймете, что к чему