首页 > 解决方案 > 更新模型的值

问题描述

我是 Django 的新手。而且我不明白 Django 模型是如何工作的。

首先,我试图在users/models.py中创建一个用户评分的模型,这样每个用户都有一个评分变量来存储自己的评分,并且评分可以更新。

然后,在我的 morse_logs/game1.html 中,我会向用户提出一个简单的问题,例如 1+1,然后我检索答案并在 morse_logs/views.py 中进行比较,看看是否正确,如果正确,我会给那个用户加 5 分;如果不正确,则不添加分数。

所以现在我正在努力定义一个正确的模型来为用户设置一个字段以获得他们自己的分数,我想知道如何在 view.py 中更新和检索用户的分数。

用户/模型.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})

标签: djangodjango-modelsdjango-views

解决方案


首先,您可能使用了错误的字段类型来存储此商店信息。

我会选择一个IntegerField

score = models.IntegerField(default=0)

因为您已从 CharField 更改为 IntegerField,所以您需要运行python manage.py makemigrationspython 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})

推荐阅读