Как получить данные из переменной в js файле и сохранить ее в базе данных не используя форму (Django)
Суть такова, что пользователь регистрируется, играет в игру, и его результат записывается в таблице (под score)
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name="email", max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
score = models.IntegerField(default=0)
Везде предлагают использовать ajax запросы, но во всех примерах используют форму.
{% if user.is_authenticated %}
<p class="authentication-title" >Hello {{ user.username }}</p>
<p class="authentication-title" >Your best score: {{ user.score }}</p>
<a class="authentication-title" href="{% url 'logout' %}">Logout</a>
{% else %}
<h1 class="authentication-title"><a class="authentication-title" href="{% url 'register' %}">Registration</a>|<a class="authentication-title" href="{% url 'login' %}">Login</a></h1>
{% endif %}
<h1 id="level-title">Your score now: </h1>
Как отправить и сохранить просто переменную (currentScore).
function startOver(currentScore) {
score = 0;
gamePattern = [];
started = false;
}
views.py
def game(request):
context = {}
return render(request, 'game.html', context)
Без ajax вам нужно использовать простые формы HTML и инициировать отарвку через JS
Например:
function startOver(currentScore) {
document.getElementById('scoresField').value = currentScore;
document.getElementById('scoresFrom').submit();
console.log(currentScore);
score = 0;
gamePattern = [];
started = false;
}
<form action="/scores-route" id="scoresFrom" method="POST">
<input type="hidden" id="scoresField" name="scores" />
</form>
<button onClick="startOver(100)">Game over</button>
Но лучше использовать AJAX - это удобнее, безопаснее!
Решение на собственный вопрос:
// Получаем уровень за игру
function send_score(level) {
let best_score = Number('{{ user.score }}'); // Получим рекордное количество
// Проверяем, больше ли наш уровень рекорда
if (level > best_score) {
username = "{{ user.username }}"; // Определяем username пользователя
// Заносим все в словарь, чтобы потом прочитать это в views.py
send_data = {
'username':username,
"score":level,
"csrfmiddlewaretoken":"{{ csrf_token }}", // Для пост запроса нужен csrf токен
};
// Отправляем ajax запрос
$.ajax(
{
url: "{% url 'game' %}",
type:"post",
data:send_data, // Отправляем словарь
// Если данные отправлены, выводим новый best_score
success:function (data) {
best_score = send_data['score'];
$('#best_score').text('Your best score: ' + best_score);
},
// Если какая-то ошибка, выводим в консоль
error:function (error) {
console.log(error);
}
}
)
}
}
views.py
def game(request):
context = {}
if request.POST: # Проверяем, был ли отправлен POST запрос
username = request.POST.get('username') # Получим username из словаря send_data
score = request.POST.get('score')# Получим score из словаря send_data
# Находим пользователя с таким username-мом и обновляем ему его score
Account.objects.filter(username=username).update(score=score)
return render(request, 'game.html', context)
Все это сделано без формы.