django - 更新模型的值
问题描述
我是 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})
解决方案
首先,您可能使用了错误的字段类型来存储此商店信息。
我会选择一个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})
推荐阅读
- javascript - 带有 settimeout 的异步 javascript 承诺调用
- react-native - React Native:点击屏幕背景时抽屉不会关闭
- github - 如何删除除 master 之外的所有 Git 远程分支?
- azure-storage - Azure Function App 中用户计算机上给定路径的图像流/字节数组
- qt - 如何更改 Qt VitrualKeyboard InputPanel 布局?
- elasticsearch - elasticsearch java api中的指数提升
- sql - 在主查询中使用子查询结果
- c# - 映射xml文件,然后导入xmls文件c#
- c# - 在 Razor Pages 应用程序中使用 Web API JWT 身份验证
- php - 在 Composer 自动加载中定义加载类的顺序