Я хочу иметь возможность отображать объект Django на HTML и иметь возможность другим объектам Django манипулировать отображаемым HTML
Я создаю фан-сайт для своего портфолио для популярной игры MOBA. Я хочу, чтобы при переходе на страницу с подробной информацией о чемпионе, где отображаются его статистические данные (урон атаки, магический урон и т.д.), пользователь мог нажать на предмет, и статистика этого предмета добавится к уже отображенному значению статов.
Например, чемпион "x" имеет 25 базового урона атаки. Предмет "a" имеет 5 единиц урона атаки. Нажмите на предмет "a", и статистика чемпиона покажет 30 единиц урона атаки. При двойном щелчке по предмету он уберет добавленные 5 единиц урона атаки и снова покажет 25 единиц урона атаки.
Метод и порядок кликов не обязателен, но предпочтителен, потому что это был мой первоначальный проект, и так как я учусь, я думаю, что должен заставить себя разобраться с этим.
Мне интересно, может ли кто-нибудь указать мне правильное направление для использования слушателей событий/какой javascript или метод будет лучшим способом сделать это, кроме загрузки каждого элемента в глобальные переменные в файле скрипта. Код для справки.
Я слышал об AJAX, но я не хочу погружаться в это в данный момент, если это не является чем-то необходимым.
Спасибо!
HTML
{% extends "./base.html" %}
{% block title %}<title>Champ | Name</title>{% endblock %}
{% block content %}
<tr>{{ object.name }}'s stats</tr>
<p> Base Health: {{ object.hp }} </p>
<p> HP increased per level: {{ object.hp_gain_per_lvl }} </p>
<p> Health Regen: {{ object.hp_regen }} </p>
<p> Health Regen Gain Per level: {{ object.hp_regen_gain_per_lvl }} </p>
<p> Base Mana: {{ object.mana }} </p>
<p> Mana increased per level: {{ object.mana_gain_per_lvl }} </p>
<p> Mana Regen: {{ object.mana_regen }} </p>
<p> Mana Regen increased per level: {{ object.mana_regen_gain_per_lvl }} </p>
<p> Base Attack Damage: <p id="attack-damage">{{ object.attack_damage }}</p> </p>
<p> Attack Damage increased per level: {{ object.attack_damage_gain_per_lvl }} </p>
<p> Base Attack Speed: {{ object.attack_speed}} </p>
<p> Attack Speed increase per level: {{ object.attack_speed_gain_per_lvl }} </p>
<p> Base Armor: {{ object.armor }} </p>
<p> Armor Increased per level: {{ object.armor_gain_per_lvl }} </p>
<p> Base Magic Resist: {{ object.magic_resist }} </p>
<p> Magic Resist increase per level: {{ object.magic_resist_gain_per_lvl }} </p>
<p> Base Movement Speed: {{ object.movement_speed }} </p>
<p> Base range: {{ object.range }} </p>
<p> Base Ability Power: {{ object.ability_power }} </p>
<p> Base Ability Haste: <p id="ability-haste">{{ object.ability_haste }}</p> </p>
<p> Base Critical hit chance: {{ object.crit }} </p>
<div class="items-container">
{% for item in Items %}
<div class="item-card">
<input type="checkbox" id="{{item.name}}" onclick="manageItem('{{item.name}}')">
<label for="{{item.name}}"><img src="{{ item.image.url }}"></label>
<p>{{item.name}}</p>
</div>
{% endfor %}
</div>
<!-- double click to remove item, click to add item, run it through an if/else to check to see if there are more than 6 items in the inventory -->
<!-- Gonna use this as an item tray for 6 items, have the item tray then effect the champs stats -->
<div class="item-container">
<div id="item1"></div>
<div id="item2"></div>
<div id="item3"></div>
<div id="item4"></div>
<div id="item5"></div>
<div id="item6"></div>
</div>```
Script
const CaulfieldWarhammer = {attack_damage:25, ability_haste:10}
let numClicks = 0;
function manageItem(item) {
numClicks++;
if (numClicks === 1) {
singleClickTimer = setTimeout(() => {
numClicks = 0;
console.log("item added");
function addItem(item){
console.log(item)
}
addItem(item)
}, 400);
} else if (numClicks === 2) {
clearTimeout(singleClickTimer);
numClicks = 0;
console.log("item removed");
}
};
Views
class CharacterStatsDetailView(DetailView):
model = CharacterStats
extra_context={'Items': ItemStats.objects.all()}
Model
class CharacterStats(models.Model):
name = models.CharField(max_length=50)
hp = models.FloatField()
hp_gain_per_lvl = models.FloatField()
hp_regen = models.FloatField()
hp_regen_gain_per_lvl = models.FloatField()
mana = models.FloatField()
mana_gain_per_lvl = models.FloatField()
mana_regen = models.FloatField()
mana_regen_gain_per_lvl = models.FloatField()
attack_damage = models.FloatField()
attack_damage_gain_per_lvl = models.FloatField()
attack_speed = models.FloatField()
attack_speed_gain_per_lvl = models.FloatField()
armor = models.FloatField()
armor_gain_per_lvl = models.FloatField()
magic_resist = models.FloatField()
magic_resist_gain_per_lvl = models.FloatField()
movement_speed = models.FloatField()
range = models.FloatField()
ability_power = models.FloatField()
ability_haste = models.FloatField()
crit = models.FloatField()
image = models.ImageField(default='charicondefault.jpg', upload_to='characterpics')
def __str__(self):
return f'{self.name}'