Обновление значения модели - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок ie из Django. И я не понимаю, как работает Django модель.

Во-первых, я пытаюсь создать модель оценки пользователя в файле users / models.py, чтобы у каждого пользователя была переменная оценки для сохранения собственного счета. и оценка может быть обновлена.

Затем в моем morse_logs / game1. html я задам пользователю вопрос, такой же простой, как 1 + 1, затем извлекаю ответ и сравниваю его в morse_logs / views.py, чтобы увидеть, правильно, если это правильно, я добавлю 5 баллов этому пользователю; если неверно, оценка не добавляется.

Так что теперь я пытаюсь определить правильную модель для установки поля для пользователя, чтобы иметь его собственную оценку, и мне интересно, как я могу обновить и получить оценку пользователя в view.py.

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

# Create your models here.


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    description = models.CharField(max_length=100, default='')
    #score = models.CharField(User, max_length=10, default=0)


def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

    post_save.connect(create_profile, sender=User)


class UserScore(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    score = models.CharField(max_length=1000, default=0)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """Returns a string representation of the model"""
        return self.score

morse_logs / game1. html

{% block content %}
<div class="container">
    <title>GAME 1</title>
    <h1>GAME 1</h1>
    <h2>1 + 1 = ?</h2>
    <input type="number" id="ans1" name="ans1"><br><br>
    <button type="submit" name="game1Answer">Decipher</button>

</div>
{% endblock content %}

morse_logs / views.py

@login_required()
def game1(request):
    """The Game 1 page"""
    val1 = request.GET.get('ans1', '')
    res = "Incorrect"

    if val1 == 2:
        #user's score declared in model increase 5points
        #display correct and 5 points added to user
        res = "Correct"
    else:
        #user's score declared in model has no point
        #display incorrect and 0 point added to user
        res = "Incorrect"

    return render(request, 'morse_logs/game1.html', {'result': res})

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Измените ваши views.py на

@login_required()
def game1(request):

    if request.user:
        user = request.user
    else:
        #throw exception

    """The Game 1 page"""
    val1 = request.GET.get('ans1', '')
    res = "Incorrect"

    if int(val1) == 2:
        #user's score declared in model increase 5points
        #display correct and 5 points added to user
        user_data = UserScore.objects.get(user=user)
        res = "Correct"
        user_data.score = int(user_data.score) + 5
        user_data.save()
    #no need to write else part  

    return render(request, 'morse_logs/game1.html', {'result': res})
0 голосов
/ 09 апреля 2020

Во-первых, у вас, вероятно, неправильный тип поля для хранения этой информации о магазине.

Я бы go с IntegerField:

score = models.IntegerField(default=0)

Поскольку вы изменили с CharField для IntegerField, вам нужно будет запустить python manage.py makemigrations и python manage.py migrate, чтобы разрешить вашу базу данных с изменениями.

Затем в ваших представлениях вы захотите что-то вроде этого, используя метод get_or_create для поиск объекта с указанным **kwargs (может быть пустым, если ваша модель имеет значения по умолчанию для всех полей), создание его при необходимости.

Ссылка здесь: https://kite.com/python/docs/django.db.models.QuerySet.get_or_create

@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"""
    val1 = request.GET.get('ans1', '')
    res = "Incorrect"

    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
        res = "Correct"
        user_score.score += 5
        user_score.save()
    else:
        #user's score declared in model has no point
        #display incorrect and 0 point added to user
        res = "Incorrect"

    return render(request, 'morse_logs/game1.html', {'result': res})
...