Цель: создать страницу, где пользователь может выбрать одну из двух «идей», нажав соответствующую кнопку. Я регистрирую каждый выбор в отдельной модели. Затем модель рассчитывает новый «балл». Затем я обновляю таблицу «идей» новым счетом.
Текущее состояние: я, вероятно, не подхожу к нему самым логичным способом (все еще начинающий), но у меня большая часть работы работает, пока я не попытаюсь вычислите балл в модели, а затем сохраните в таблице идей.
Где я застрял: модель результатов, как представляется, записывает одни и те же числа каждый раз, поэтому я знаю, что она не набирает нужное число или не пишет это правильно. Кроме того, он не обновляет таблицу идей после сохранения новой записи в таблице результатов.
Модели
class PublishedManager(models.Manager):
def get_queryset(self):
return super(PublishedManager, self).get_queryset().filter(status=1)
class ideas(models.Model):
title = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=100)
description = models.TextField()
author = models.EmailField()
elo_score = models.SmallIntegerField(default=1500)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
release = models.CharField(max_length=10, blank=True)
s_in_review = 0
s_open = 1
s_rejected = 2
s_completed = 3
s_choices = (
(s_in_review, _('In Review')),
(s_open, _('Open')),
(s_rejected, _('Rejected')),
(s_completed, _('Completed')),
)
status = models.PositiveSmallIntegerField(
choices=s_choices,
default=s_in_review,
)
objects = models.Manager()
published = PublishedManager()
class Meta:
verbose_name_plural = "ideas"
def __str__(self):
return self.title
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(ideas, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('backlog:idea-detail', args=[self.slug])
class pairwise_results(models.Model):
win_idea = models.ForeignKey(ideas, on_delete=models.CASCADE, related_name='win_idea_name')
lose_idea = models.ForeignKey(ideas, on_delete=models.CASCADE, related_name='lose_idea_name')
datetime = models.DateTimeField(auto_now_add=True)
win_elo = models.SmallIntegerField(default=1500)
lose_elo = models.SmallIntegerField(default=1500)
new_win_elo = models.SmallIntegerField(default=1500)
new_lose_elo = models.SmallIntegerField(default=1500)
def win_elo_transformed(self):
return 10**(self.win_elo/400) #hard-coded variable
def lose_elo_transformed(self):
return 10**(self.lose_elo/400) #hard-coded variable
def win_expected(self):
return self.win_elo_transformed()/(self.win_elo_transformed()+self.lose_elo_transformed())
def lose_expected(self):
return self.lose_elo_transformed()/(self.win_elo_transformed()+self.lose_elo_transformed())
def win_elo_new(self):
return self.win_elo+25*(1-self.win_expected())
def lose_elo_new(self):
return self.lose_elo+25*(0-self.win_expected())
def __str__(self):
return self.datetime.strftime("%m/%d/%Y, %H:%M:%S")
def save(self, *args, **kwargs):
self.new_win_elo = self.win_elo_new()
self.new_lose_elo = self.lose_elo_new()
super(pairwise_results, self).save(*args, **kwargs)
Представления - я не уверен, стоит ли объединять их и обрабатывать с помощью get / опубликовать или разбить их еще больше
def idea_pairwise(request):
last=ideas.published.count()-1
index1 = random.randint(0,last)
index2 = random.randint(0, last-1)
if index2==index1: index2=last
idea1 = ideas.published.all()[index1]
idea2 = ideas.published.all()[index2]
context = {'idea1': idea1, 'idea2': idea2}
return render(request, 'backlog/ideas_pairwise.html', context)
def choose_pairwise(request, win_id, lose_id):
w_idea = get_object_or_404(ideas, id=win_id)
l_idea = get_object_or_404(ideas, id=lose_id)
new_choice = pairwise_results(win_idea=w_idea, lose_idea=l_idea, win_elo=w_idea.elo_score, lose_elo=l_idea.elo_score)
new_choice.save()
#new_record = new_choice.save(commit=False)
w_idea.elo_score = new_choice.win_elo_new()
l_idea.elo_score = new_choice.lose_elo_new()
return redirect('backlog:idea_pairwise')
HTML:
<div class="row m-4">
<div class="card-deck container-fluid">
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ idea1.title }}</h5>
<p class="card-text">{{ idea1.description }}</p>
</div>
<div class="card-footer text-center">
<!-- <a href="#" class="btn btn-primary">Choose Idea 1</a> -->
<form action="{% url 'backlog:choose_pairwise' idea1.id idea2.id %}" method="post">{% csrf_token %}<input class="btn btn-primary" type="submit" name="chosen_idea" value="Choose Idea 1" /></form>
</div>
</div>
<div class="card">
<div class="card-body">
<h5 class="card-title">{{ idea2.title }}</h5>
<p class="card-text">{{ idea2.description }}</p>
</div>
<div class="card-footer text-center">
<!-- <a href="#" class="btn btn-primary">Choose Idea 2</a> -->
<form action="{% url 'backlog:choose_pairwise' idea2.id idea1.id %}" method="post">{% csrf_token %}<input class="btn btn-primary" type="submit" name="chosen_idea" value="Choose Idea 2" /></form>
</div>
</div>
</div>
</div>
URLs
path('ideas/rank/pairwise/', idea_pairwise, name='idea_pairwise'),
path('ideas/rank/pairwise/choose/<int:win_id>/<int:lose_id>/', choose_pairwise, name='choose_pairwise'),