django - Django:提交表单后获取最新的数据库对象值
问题描述
我有一个将三个输入值保存到数据库的表单,1)数字,2)颜色,3)制作。在我按下“提交”后,另一个例程应该立即显示这些值。
问题是我无法获得要显示的最新值,但是,一旦最初分配了值,它们就不会更新并坚持第一个分配的值。
为了解决这个问题,posts 建议更新对象,例如Django Get Latest Entry from Database,我创建了一个函数,在按下提交后我在视图中调用它,但没有运气。
from django.forms import ModelForm
from django.views.generic import FormView
from django.urls import path, include
from django.urls import reverse
class Product(models.Model):
number = models.CharField(max_length=10)
color = models.CharField(max_length=10)
make = models.CharField(max_length=10)
objects = models.Manager()
class ProductModelForm(ModelForm):
class Meta:
model = Product
fields = ('__all__')
def database():
dbo = Product.objects.latest('id')
dbo.refresh_from_db()
return dbo
class ProductFormView(FormView):
form_class = ProductModelForm
template_name = 'form/test_form.html'
def form_valid(self, form):
form.save()
return super().form_valid(form)
def get_success_url(self):
database()
print(Product.objects.latest('id')) # just as a test
return reverse('product')
urlpatterns = [
path('', ProductFormView.as_view(), name='product'),
]
# <!DOCTYPE html>
# <html lang="en">
# <head>
# <meta charset="UTF-8">
# <title>Title</title>
# </head>
# <body>
# <form method="post" >
# {% csrf_token %}
# {{form}}
# <button type="submit" class="btn btn-default">Submit</button>
# </form>
# </body>
# </html>
我有一个简单的例程(db_connector.py)我在数据库对象和变量之间创建了一个链接,例如(没有任何函数或类):
number = database().number
color = database().color
make = database().make
这可能是错误的做法,但反映了(可能是幼稚的)最小化数据库请求的尝试,其想法是请求一个对象,然后将该对象拆分为多个部分并链接到这些部分。
问题是:
- 我更新表单中的所有值并按提交(有效),这个最新条目现在位于数据库的“顶部”。我想检索这个对象('number'、'color'和'make'的最新输入值。但是,我没有给我这个对象,而是得到了一个更早的对象。尽管试图“刷新”链接的对象(产品.objects.latest('id')) 它被较早的输入(第一个输入)卡住。
问题是:
- 一旦我在表单上按下提交(更新值),我应该怎么做才能始终获得最新的输入值?
解决方案
尽管您提供的代码还不够 imo,但我会尽力提供帮助和解释。
根据我的理解(从未使用过refresh_from_db
),您不能使用refresh_from_db
这种方式。
在您的database()
函数中,您获得了最后一个条目并尝试刷新其信息,尽管自获得它以来您没有更改它,使其成为毫无意义的行(它不会刷新查询,但实例会作为结果返回)。
refresh_from_db()
如果您在从数据库获取和使用它之间更改了特定实例信息,则更新它。
根据文档中的示例:
def test_update_result(self):
obj = MyModel.objects.create(val=1)
MyModel.objects.filter(pk=obj.pk).update(val=F('val') + 1)
# At this point obj.val is still 1, but the value in the database
# was updated to 2. The object's updated value needs to be reloaded
# from the database.
obj.refresh_from_db()
self.assertEqual(obj.val, 2)
它根本不做你认为它做的事情。
您的提交按钮应该调用相关类视图中的 post 方法,或者将这些值保存到数据库中的某些函数(您自己也提到过)。
在您的反向视图函数或类中,您可以编写您在datebase()
-中编写的查询Product.objects.latest('id')
。
此外,您可以使用以下附加信息进行反转:return reverse('product', kwargs={'lastprod': Product.objects.latest('id')})
.
如果这还不够清楚,请告诉我。
推荐阅读
- ios - 如何为 GoogleMaps 正确提供 api 密钥?
- python - 如何选择系列的第一个元素并使用python将其重新分配给数据框列中的单元格
- python - opencv背景噪声减除和运动检测面临的问题
- node.js - 来自 Nodemailer 的一些电子邮件没有到达客户
- xml - Oracle 正则表达式向后/向前看不起作用
- sql - 正则表达式 REGEXP_SUBSTR 拆分为列
- python - 在将日期与列表进行比较时,用更有效的方法替换 for 循环
- java - Maven - Docker java.lang.NoClassDefFoundError: org/apache/http/client/methods/HttpUriRequest
- scala - 如何在 Scala 中对两列进行字符串连接,但按字母顺序对结果列进行排序?
- python - H2OFrame 列到数组:最快的方法?