【问题标题】:Add 1 to a database value when button is pressed using Django使用 Django 按下按钮时将 1 添加到数据库值
【发布时间】:2021-04-21 09:32:58
【问题描述】:

我有一个看起来像这样的 django 模型:

class Character(models.Model):
character_Name = models.CharField(max_length=50)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
level = models.PositiveSmallIntegerField(validators=[MaxValueValidator(20), MinValueValidator(1)], default=1)

def __str__(self):

    return self.character_Name

使用如下所示的 html 文件(main.html):

<!DOCTYPE html>

<html lang="en">
        <body>
          <h1>{{ characters.character_Name }}</h1>
          <h4>Level: {{ characters.level }}</h4>
          <button onclick="increase_level()"> + 1 </button>
        </body>    

views.py 中的函数如下所示:

def main(request):
    if request.user.is_authenticated:
        characters = Character.objects.filter(user=request.user).order_by('character_Name').first
        return render(request, 'main.html', {'characters': characters})
    else:
        return redirect('account creation')

及其来自 urls.py 的路径:

path('main', views.main, name='main'),

如何实现按1级更新页面和数据库的按钮?

【问题讨论】:

    标签: python html django web


    【解决方案1】:

    创建一个视图,在这个视图中执行以下操作:

    character = Character.objects.filter(user=request.user).order_by('character_Name').first()
    character.level = F('level') + 1
    character.save()
    

    在此之前你需要导入F

    from django.db.models import F
    

    现在在您的 html 中按下按钮,向您创建的该视图发出 ajax 请求。
    编辑:因为您希望它更新您所在的页面,所以不需要需要是一个ajax请求。只需使用此视图 url 使按钮成为锚标记,并在视图结束时重定向到您所在的相同 url(带有按钮的那个)。

    【讨论】:

      【解决方案2】:

      不完全确定...但我会尝试类似的方法:

      在 urls.py 中

       path('addone/<int:pk>/<int:level>', views.change_level, name='change_level'),
      

      在 html 文件中

       <a href="{% url 'YOURAPP:change_level' characters.id characters.level  %}">Add 1</a>
      

      在视图中

       from django.shortcuts import render, redirect
       from django.contrib.auth.decorators import login_required
      
       @login_required
       def change_level(request, level, pk):
      
           character_selected = Character.objects.get(pk=pk)
      
           new_level = level + 1
           character_selected.level = new_level
           character_selected.save()
      
           return redirect('YOURAPP:main')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        相关资源
        最近更新 更多