Получить и обновить поле модели на видах и отобразить обновленное поле в шаблоне - PullRequest
0 голосов
/ 11 апреля 2020

Я работаю над представлением, которое извлекает поле (оценку пользователя), объявленное в модели, где я также обновлю поле (оценку пользователя) после простого оператора if-else, а затем отобразю поле в шаблоне.

Но теперь в текстовой области шаблона, куда я поместил результат, теперь отображается только userScore: объект userScore (1), False вместо значения оценки пользователя. .

Итак, как я могу получить оценку пользователя из модели и обновить поле в представлениях?

morse_logs / game1. html

{% block content %}
    <title>GAME 1</title>
    <h1>GAME 1</h1>
    <h2>1 + 1 = ?</h2>
    <form action="" method="get" >
        <input type="number" id="ans1" name="ans1"/><br><br>
        <button type="submit" name="game1Answer">Submit</button><br><br>
        <textarea rows="10" cols="50" name='a2' > {{currentS}} </textarea>
    </form>
</div>
{% endblock content %}

morse_logs / views.py

@login_required()
def game1(request):

    if request.user and not request.user.is_anonymous:
        user = request.user
    #else:
        #Throw some raised exception here as the user is not valid...

    """The Game 1 page"""
    def verifyGame1(val1):
        user_score = userScore.objects.get_or_create(user=user)

        if val1 == 2:
            #user's score declared in model increase 5points
            #display correct and 5 points added to user
            user_score.score += 5
            #user_score = str(user_score)
            user_score.save()
            return user_score
        else:
            #user's score declared in model has no point
            #display incorrect and 1 point added to user
            #user_score = str(user_score)
            return user_score

    ans1 = request.GET.get('ans1', '')
    cScore = verifyGame1(ans1)

    return render(request, 'morse_logs/game1.html', {'currentS': cScore})

users / models.py

from django.db import models
from django import forms
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class userScore(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, primary_key=True)
    score = models.IntegerField(default=0)

1 Ответ

2 голосов
/ 11 апреля 2020

Прежде всего get_or_create возвращает кортеж, первое значение - это объект, а второе значение - True, если объект создан. Поэтому измените строку в вашем представлении на:

user_score, created = userScore.objects.get_or_create(user=user)

Тогда userScore - это модель, оценка сохраняется в поле score. Чтобы показать значение в вашем шаблоне, либо

вставьте это в свой шаблон:

<textarea rows="10" cols="50" name='a2' > {{currentS.score}} </textarea>

или передайте значение оценки из вашего представления в ваш шаблон:

return render(request, 'morse_logs/game1.html', {'currentS': cScore.score})

Наконец: убедитесь, что вы передаете целое число как val1 в функцию verifyGame1, <input> в html возвращает строку. Так что-то вроде cScore = verifyGame1(int(ans1)).

...