首页 > 解决方案 > 使用更新模型中的值的按钮为用户交互编写 Django 的最佳方法是什么

问题描述

我正在尝试为以下编写 Django 代码:

用户按下前端的按钮。多个按钮选项可将值递减 10、20、30 等。

当用户按下按钮时,后端的 Django 模型属性的值将相应递减。例如在下面的代码中,我将初始值设置为 107。当用户按下 html 模板中的“减 10”按钮时,我希望从 107 中减去 10,这样该值就变为 97。用户没有输入任何数据.

我没有成功尝试使用 Django modelForm 和“POST”,但没有成功。

任何建议表示赞赏。

下面是我没有工作的代码。

模型.py

class Balance(models.Model):
    userBalance = models.DecimalField(max_digits=10, decimal_places=2, null=True)

表格.py

class BalanceForm(forms.ModelForm):
    class Meta:
        model = Balance
        fields = ['userBalance']

视图.py

def balance(request):
    form = BalanceForm(initial={"userBalance":107})
    if form.is_valid():
        if request.method == "POST" and "form10" in request.POST:
            formValue = form.cleaned_data.get('userBalance')
            form2 = formValue - 10
            return render(request, "econlabs/balance.html", {'form2': form2})
    return render(request, "econlabs/balance.html", {'form': form})

标签: djangodjango-modelsdjango-viewsdjango-formsrelational-database

解决方案


为该模型创建一个更新视图并指定您要更新的字段。您可以使用自定义表单,但相信我,这些通用视图会为您节省大量时间。

视图.py:

from django.views.generic.edit import UpdateView


class updBalanceUpdateView(UpdateView):
    model = Balance
    fields = ['userBalance']
    template_name_suffix = '_update_form'

在所有属性中,您可以提及需要更新的属性。如上面最后一行 (template_name_suffix) 所示,为模板使用相同的命名后缀模式... [modelname_update_form.html] 并显示表单...

Balance_update_form.html:

{% extends "base.html" %}
{% load static %}
{% load bootstrap_tags %}
{% block title %} Update {% endblock %}

{% block body%}
<div class="jumbotron">
    Are you sure you want to update ?
</div>
<br>

<form method="POST">
    {% csrf_token %}
    {{ form|as_bootstrap  }}
    <input type="submit" value="Submit" />
</form>

{% endblock %}

确保从模板中获取要更新的相应元素:

<h3><a href="{% url 'app_name:update' pk=val.pk %}">update</a></h3>

单击上面会触发 url。添加网址,

网址.py:

path('update/<int:pk>', views.updBalanceUpdateView.as_view() , name = "update"),

PS:您还可以使用查询更新视图中的值以选择所需的对象,然后像这样编辑它们,

在 view.py 中:

example = Balance.objects.filter(id = pk).update(userBalance = userBalance - 10)

查看文档以获取更多信息: https ://docs.djangoproject.com/en/3.1/ref/class-based-views/generic-editing/


推荐阅读